功能不会返回任何内容

时间:2015-05-07 03:20:52

标签: c# forms function unit-testing

单元测试一个函数但是当我运行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 = <> 

我不确定是什么导致这种情况,但我觉得这是一个愚蠢的简单错误,比如缺少引用,但是当我运行代码时没有错误。

4 个答案:

答案 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, "

注意:当单元测试失败时,它会抛出异常,包括实际和预期结果之间的差异