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}};