Добавленный функционал сломал мои тесты - очень простая логика тоже - PullRequest
0 голосов
/ 21 марта 2012

У меня есть код, подобный этому:

public List<string> Expected = new List<string>();
public int SpecifiedID;

public DataIn(int ID, string Value)
{
  Expected.Add(Value);
  //if (ID == SpecifiedID)
  //Expected.Clear();  

  //Need to add this but my tests that do something like      
  //CollectionAssert.AreEqual(new[] { "2", "4", "6", "8" }, logic.Expected);
  //all fail as Expected is empty.
}

//Example Test
[Test]
public void NewTestFunction()
{
   MyClass logic = new MyClass();   
   logic.SpecifiedID = 4;

   logic.DataIn(1,"2"); 
   logic.DataIn(2,"4"); 
   logic.DataIn(3,"6"); 
   logic.DataIn(4,"8"); 

   //This will FAIL if Expected.Clear is added in the class.
   CollectionAssert.AreEqual(new[] { "2", "4", "6", "8" }, logic.Expected);
}

Это значительно упрощается, однако у меня есть тесты, которые проверяют правильность содержимого Expected при вызове DataIn. Однако теперь я понял, что должен очищать Expected после каждого DataIn вызова. Это сломало мои тесты, очевидно, так как нечего утверждать.

Любые предложения о том, как сохранить тесты, которые проверяют содержимое, но также позволяют мне очистить коллекцию?

Ответы [ 4 ]

2 голосов
/ 21 марта 2012

Ответ прост - ваш код не проходит ваш тест. То есть он не ведет себя так, как ожидалось (вы описываете ожидаемое поведение в своем тесте). Итак, код должен измениться - удалите вызов Expected.Clear (). Или подумайте, что вы ожидаете от своего кода.

ОБНОВЛЕНИЕ (для случая, когда ожидания меняются):

public void ShoulHaveAllDataInWhenIdIsNotSpecifiedID()
{
   MyClass logic = new MyClass();   
   logic.SpecifiedID = 3;

   logic.DataIn(1,"2"); 
   logic.DataIn(2,"4");     

   CollectionAssert.AreEqual(new[] { "2", "4" }, logic.Expected);
}

[Test]
public void ShoulClearAllDataWhenSpecifiedIDPassed()
{
   MyClass logic = new MyClass();   
   logic.SpecifiedID = 3;

   logic.DataIn(1,"2"); 
   logic.DataIn(2,"4"); 
   logic.DataIn(3,"6");     

   CollectionAssert.AreEqual(new[] { }, logic.Expected);
}

Также рассмотрите возможность тестирования поведения вместо тестирования состояния. Предоставляя макеты вашему классу, вы можете проверить, как он взаимодействует с ними. То есть проверьте, какие данные переданы вашей классовой зависимости.

1 голос
/ 21 марта 2012

Когда SpecifiedID совпадает, все должно быть очищено

Это один тест. Создайте свой объект. Дайте ему SpecifiedId X. Вызовите DataIn () для него с Y в качестве первого параметра, а затем с X в качестве первого параметра. Утверждают, что Ожидаемый пуст. Простой.

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

Это еще один тест. Создайте свой объект. Задайте ему SpecifiedId для X. Повторно вызывайте DataIn () для него, никогда не используя X в качестве идентификатора. Утвердите, что Ожидаемый содержит переданные значения. Простой.

Два требования, два теста. На самом деле, я не понимаю, в чем тут дело.

1 голос
/ 21 марта 2012

Инициализация до известного хорошего состояния должна быть частью вашего метода настройки теста / класса. Из вашего описания, тем не менее, кажется, что у вас слишком сильная связь между вашими тестами или что ваши тесты тестируют слишком много за один раз. Каждый тест с соответствующей настройкой должен быть независимым и идеально работать параллельно. Обычно это означает, что каждый из них работает с другим экземпляром тестируемого класса, и у вас нет зависимостей от глобальных данных, или, по крайней мере, эти зависимости доступны только для чтения, поэтому вы можете установить его один раз для всех тестов.

0 голосов
/ 21 марта 2012

Почему бы просто не изменить функцию теста.Создайте новую функцию тестирования:

[Test]
public void NewTestFunction()
{
    Data("Bla"); 

    //Test for something


    Expected.Clear();
}

Если это не то, о чем вы просите, уточните.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...