Логика в модульных тестах - PullRequest
4 голосов
/ 20 марта 2012

У меня есть модульный тест, например, так:

    [Test]
    public void DataIn_NoOfRowsReached_CreatesSequentialData()
    {
        //Assert
        MyLogic logic = SetupLogic();
        logic.NoOfRows = 3;

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

        CollectionAssert.AreEqual(new[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, logic.ExpectedValues);
    }

Каждый вызов DataIn добавляет переданные данные в отдельный список в зависимости от идентификатора (1-й параметр).Когда число NoOfRows равно входному идентификатору DataIn, данные объединяются, чтобы быть последовательными.Затем я проверяю это, чтобы проверить это.

Теперь я хочу использовать контрольные примеры, но я не вижу простого способа сделать это без добавления операторов if и различных необязательных параметров в метод теста.Я действительно не хочу дублировать тесты для различных сценариев.

Максимум NoOfRows равен 6.

Ответы [ 3 ]

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

Я считаю, что это то, что вы ищете. Используйте ключевое слово params , чтобы разрешить передачу произвольного количества строк.

[Test]
public void DataIn_NoOfRowsReached_CreatesSequentialData()
{
    MyGenericTest("1,4,7", "2,5,8", "3,6,9");
}

private void MyGenericTest(params string[] inputs)
{
    //Assert
    MyLogic logic = SetupLogic();
    logic.NoOfRows = inputs.Length;

    List<string> allNumbers = new List<string>();
    for(int i = 0; i < inputs.Length; i++)
    {
       logic.DataIn(i + 1, inputs[i]);
       allNumbers.AddRange(inputs[i].Split(',');
    }

    allNumbers.Sort();
    CollectionAssert.AreEqual(allNumbers.Distinct(), logic.ExpectedValues);
}

Это просто выполняет сортировку строк ... если у вас есть числа больше 9, вам нужно добавить свою собственную функцию сравнения в метод Sort () .

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

Если вы используете NUnit и хотите запустить несколько тестовых случаев с разными входными данными, вы можете использовать атрибут Values ​​http://nunit.com/index.php?p=values&r=2.6.

Ваш модульный тест может выглядеть так:

[Test]
public void DataIn_NoOfRowsReached_CreatesSequentialData([Values(new[] { "1,4,7", "2,5,8", "3,6,9" }, ...)] string[] vals)
{
    //Assert
    MyLogic logic = SetupLogic();
    logic.NoOfRows = vals.Length;

    for (var i = 0; i < vals.Length; ++i)
      logic.DataIn(i + 1, vals[i]);

    CollectionAssert.AreEqual(new[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" }, logic.ExpectedValues);
}
0 голосов
/ 20 марта 2012

Если вы хотите написать несколько «умных» тестов, вы, вероятно, можете создать ожидаемый массив с числами, которые вы вводите в качестве входных данных, и отсортировать их, вы можете отслеживать числа, которые вы вводите как часть каждой строки (используйте некоторые числасоздать строку).Кроме этого, я не вижу особых улучшений.

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