单元测试一个函数但是当我运行unit test
时函数不返回任何内容。
这是功能:
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);
}
这是单元测试
[TestMethod]
public void CheckUniqueWordsAreFoundTest()
{
string actual, expected;
Form1 frm1 = new Form1();
actual = frm1.FindUniqueWords(unitTestOccurenceDictionary);
expected = "hello, world, i, am, god, of, this, ";
Assert.AreEqual(expected, actual);
}
我将这本字典发送到函数
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);
}
当我运行单元测试时,它会失败并显示
actual = <>
我不确定是什么导致这种情况,但我觉得这是一个愚蠢的简单错误,比如缺少引用,但是当我运行代码时没有错误。
答案 0 :(得分:1)
我认为您的问题可能只是字典不保证其项目的顺序。
尝试更改像这样的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;
然后您可以更改单元测试以获得有序结果:
var expected = "am, god, hello, I, of, this, world";
并且测试应该开始通过。
注意:其他几个人提到你也遇到了问题&#34;,&#34;在字符串的末尾,这促使我使用String.Join
。 @paxdiablo和@ trungtin1710以及@HariPrasad的道具发现此问题。
答案 1 :(得分:1)
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}};
现在它正常工作。
答案 2 :(得分:0)
首先,语句uniqueWord += (pair.Key + ", ");
会将每个键和一个逗号/空格对添加到结果字符串中。
因此实际上从函数中出来的内容(但请参见下面的订购)将是:
"hello, world, i, am, god, of, this, "
解决这个问题的方法是在for
循环之后立即插入到您的函数中,例如:
char trimChars[] = {',', ' '};
uniqueword = uniqueword.TrimEnd(trimChars);
删除最后的违规字符。
你的第二个问题似乎是你的字典是空的,因为你声明actual = <>
,我认为你的意思是空字符串。
如果是这种情况,那么你需要调查字典没有被填充的原因,很可能是因为你从不打电话给UnitTest1.Add
。
第三个问题与MSDN documentation:
有关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);
答案 3 :(得分:0)
预期结果是
expected = "hello, world, i, am, god, of, this";
购买取决于您的代码,实际结果将如下所示
actual = "hello, world, I, am, got, of, this, "
注意:当单元测试失败时,它会抛出异常,包括实际和预期结果之间的差异