C# 函数不会返回任何内容
单元测试一个函数,但当我运行C# 函数不会返回任何内容,c#,forms,function,unit-testing,C#,Forms,Function,Unit Testing,单元测试一个函数,但当我运行单元测试时,该函数没有返回任何内容 这就是功能: public string FindUniqueWords(Dictionary<string, int> dictionary) { string uniqueWord = ""; foreach (KeyValuePair<string, int> pair in dictionary) //loop through the occurence
单元测试时,该函数没有返回任何内容
这就是功能:
public string FindUniqueWords(Dictionary<string, int> dictionary)
{
string uniqueWord = "";
foreach (KeyValuePair<string, int> pair in dictionary) //loop through the occurenceDictionary
{
uniqueWord += (pair.Key + ", ");
}
uniqueWords.Text = uniqueWord;
return (uniqueWord);
}
我将把这本词典发送给函数
public class UnitTest1
{
public Dictionary<string, int> unitTestOccurenceDictionary = new Dictionary<string, int>();
public void Add(string key, string value)
{
unitTestOccurenceDictionary.Add("hello", 1);
unitTestOccurenceDictionary.Add("world", 2);
unitTestOccurenceDictionary.Add("I", 1);
unitTestOccurenceDictionary.Add("am", 1);
unitTestOccurenceDictionary.Add("god", 1);
unitTestOccurenceDictionary.Add("of", 1);
unitTestOccurenceDictionary.Add("this", 1);
}
公共类UnitTest1
{
公共字典UnitTestOccurrenceDictionary=新字典();
公共void添加(字符串键、字符串值)
{
UnitTestOccurrenceDictionary.Add(“hello”,1);
UnitTestOccurrenceDictionary.Add(“世界”,2);
UnitTestOccurrenceDictionary.Add(“I”,1);
UnitTestOccurrenceDictionary.Add(“am”,1);
UnitTestOccurrenceDictionary.Add(“上帝”,1);
UnitTestOccurrenceDictionary.Add(“of”,1);
UnitTestOccurrenceDictionary.Add(“this”,1);
}
当我运行单元测试时,它失败了,并显示
actual = <>
actual=
我不确定是什么原因导致了这种情况,但我觉得这是一个愚蠢的简单错误,就像缺少引用一样,但在我运行代码时没有错误。我认为您的问题可能只是字典不能保证其项的顺序
尝试像这样更改FindUniqueWords函数,以对返回的项目强制执行订单:
string uniqueWord = "";
List<string> result = new List<string>();
foreach (var key in dictionary.Keys.OrderBy(x => x))
{
result.Add(key);
}
var uniqueWord = String.Join(", ", result);
return uniqueWord;
测试应该开始通过了
注意:其他几个人提到,字符串末尾的“,”也有问题,这促使我使用字符串。请加入。为发现此问题,向@paxdiablo和@trungtin1710和@HariPrasad添加一些道具。首先,语句uniqueWord+=(pair.Key+“,”);
将每个键和逗号/空格对添加到结果字符串中
因此,函数实际产生的结果(但请参见下文关于排序的内容)将是:
"hello, world, i, am, god, of, this, "
解决此问题的方法是在for
循环之后立即插入函数,类似于:
char trimChars[] = {',', ' '};
uniqueword = uniqueword.TrimEnd(trimChars);
删除结尾处的冒犯字符
您的第二个问题似乎是您的字典是空的,因为您声明actual=
,我假定您的意思是空字符串
如果是这种情况,那么您需要调查字典没有被填充的原因,很可能是因为您从未调用UnitTest1.Add
第三个问题是与以下方面有关:
未指定Dictionary.KeyCollection中键的顺序
因此,你不能确定这些词是否会按照你期望的顺序出现
这个问题有点棘手,但也可以解决。第一步是修改字符串,使每个单词后面都有分隔符:
actual = actual + ", ";
然后依次使用删除每个单词的字符串,例如:
actual = Regex("hello, ").Replace(actual,"",1);
actual = Regex("world, ").Replace(actual,"",1);
actual = Regex("i, ").Replace(actual,"",1);
actual = Regex("am, ").Replace(actual,"",1);
actual = Regex("god, ").Replace(actual,"",1);
actual = Regex("of, ").Replace(actual,"",1);
actual = Regex("this, ").Replace(actual,"",1);
然后您应该得到一个空字符串:
Assert.AreEqual("", actual);
预期的结果是
expected = "hello, world, i, am, god, of, this";
购买取决于您的代码,实际结果如下所示
actual = "hello, world, I, am, got, of, this, "
注意:当单元测试失败时,它将抛出异常,包括实际结果和预期结果之间的差异Mike发现了我的问题,因为我没有调用Add函数,所以我的字典是空的,我已经将代码修改为此
public Dictionary<string, int> unitTestOccurenceDictionary
= new Dictionary<string, int>() {
{"hello", 1},
{"world", 2},
{"i", 1},
{"am", 1},
{"god", 1},
{"of", 1},
{"this", 1}};
public Dictionary<string, int> unitTestLengthDictionary
= new Dictionary<string, int>() {
{"hello", 5},
{"world", 5},
{"i", 1},
{"am", 2},
{"god", 3},
{"of", 2},
{"this", 4}};
公共字典UnitTestOccurrenceDictionary
=新字典(){
{“你好”,1},
{“世界”,2},
{“i”,1},
{“am”,1},
{“上帝”,1},
{“of”,1},
{“this”,1}};
公共字典UnitTestLength字典
=新字典(){
{“你好”,5},
{“世界”,5},
{“i”,1},
{“am”,2},
{“上帝”,3},
{“of”,2},
{“这个”,4}};
现在它工作正常。在函数中,它会为每个单词(包括最后一个单词)添加,
,然后是空格。因此,预期的输出将是“你好,世界,我,我,上帝,这个,”.你在哪里调用Add
?根据我看到的情况,字典将为空,导致输出为空字符串。还有其他问题,但这可能是导致实际为空的原因。
。字典没有排序,因此不能保证你将按照添加的顺序获取项目。@mikez你说得对在fixed it Thanks中,Dictionary
中int值的用途是什么。我认为您可以使用List
而不是Dictionary
您知道迭代字典元素的顺序是不确定的,因此您的测试可能在将来的任何时候失败?
actual = "hello, world, I, am, got, of, this, "
public Dictionary<string, int> unitTestOccurenceDictionary
= new Dictionary<string, int>() {
{"hello", 1},
{"world", 2},
{"i", 1},
{"am", 1},
{"god", 1},
{"of", 1},
{"this", 1}};
public Dictionary<string, int> unitTestLengthDictionary
= new Dictionary<string, int>() {
{"hello", 5},
{"world", 5},
{"i", 1},
{"am", 2},
{"god", 3},
{"of", 2},
{"this", 4}};