2015-05-07 6 views
2

Модуль тестирования функции, но функция ничего не возвращает, когда я запускаю 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

В вашей функции он добавляет ', ', за которым следует пробел для каждого слова (включая последнее слово). Таким образом, ожидаемый результат будет «hello, world, i, am, god, of, this». –

+0

Где вы называете 'Добавить'? На основе того, что я вижу, словарь будет пустым, в результате чего вывод будет пустой строкой. Есть и другие проблемы, но это было бы причиной для пустого 'фактического'. Словарь не упорядочен, поэтому нет гарантии, что вы получите предметы в том порядке, в котором они были добавлены. –

+0

@mikez Вы были правы, что исправили это благодаря –

ответ

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

и испытание должен начать проходить.

Примечание: некоторые другие упомянули, что у вас также есть проблемы с символом «,» в конце строки, что побудило меня использовать String.Join. Поддержки к @paxdiablo и @ trungtin1710 и @HariPrasad для определения этой проблемы.

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); 
0

ожидаемый результат

expected = "hello, world, i, am, god, of, this"; 

купить зависит от вашего кода, фактический результат будет выглядеть следующим образом

actual = "hello, world, I, am, got, of, this, " 

Примечание: когда модульное тестирование несостоявшимся, он будет бросать исключение включать то, что отличается между фактическим и ожидаемым результатом

1

Майк заметил мою проблему в том, что я не вызывал функцию «Добавить», поэтому мой словарь был пуст. С тех пор как я изменил свой код на это

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

И он работает правильно.

Смежные вопросы