Модульное тестирование заморозки мозга - PullRequest
2 голосов
/ 22 февраля 2012

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

private List<string> DataStoreContents = new List<string>(new[] { "", "", "", "" });

public void InputDataStore(int DataStore, string Data)
{
  DataStoreContents[DataStore - 1] = Data;
}

Я хочу убедиться, что хранилище данных> = 1 и <= 4 </p>

Как мне написать модульный тест, обеспечивающий это?

Ответы [ 5 ]

2 голосов
/ 22 февраля 2012

Либо

Assert.IsTrue(DataStore >= 1 && DataStore <= 4);

или, если вы предпочитаете свободный интерфейс

Assert.That(DataStore, Is.GreaterThanOrEqualTo(1).And.LessThanOrEqualTo(4));

[ РЕДАКТИРОВАТЬ - в ответ на ваше разъяснение выше]

Звучит так, будто вы хотите провести какую-то проверку барьера, чтобы убедиться, что заданные значения находятся в диапазоне.

В этом случае у вас есть несколько вариантов:

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

Еще один простой подход - написать барьерную проверку самостоятельно:

public void InputDataStore(int DataStore, string Data)
{
    if (DataStore < 1 || DataStore > 4)
    {
        throw new ArgumentOutOfRangeException("DataStore", "Must be in the range 1-4 inc.");
    }
    DataStoreContents[DataStore - 1] = Data;
}

Если вы не хотите создавать исключение, но, возможно, захотите зарегистрировать его ичистый выход:

public void InputDataStore(int DataStore, string Data)
{
    if (DataStore < 1 || DataStore > 4)
    {
        // log something here and then return
        return;
    }
    DataStoreContents[DataStore - 1] = Data;
}

Чтобы вернуться к модульному тестированию.Например, модульный тест может быть тестом, который вы пишете, чтобы проверить, что при вызове InputDataStore со значением, выходящим за пределы диапазона, он выдает исключение.Другое - когда он вызывается со значением в диапазоне, он не выдает исключение и корректно обновляет DataStoreContents.

1 голос
/ 22 февраля 2012
Assert.IsTrue(DataStore >= 1 && DataStore <= 4);
0 голосов
/ 22 февраля 2012

Я думаю, что вы не можете "проверить" здесь.

Вы можете вставить проверку, которая будет выполняться во время выполнения.Упомянутая проверка может помочь, но она не будет намного более полезной, чем ArrayOutOfBoundsException, которую вы все равно получите ...

Кроме того, вставка чека - это не то же самое, что тестирование.

Выследует обратить внимание на вызывающие функции функции InputDataStore.

Это можно проверить: создайте несколько различных ситуаций, выполните вызывающие программы и проверьте, передают ли они правильное значение InputDataStore.

0 голосов
/ 22 февраля 2012

Может быть, это?(все должно провалиться, пока вы не исправите)

[Test]
[TestCase(5)]
[TestCase(0)]
[TestCase(int.MaxValue)]
[TestCase(int.MinValue)]
public void InvalidIndices(int index)
{
    Assert.DoesNotThrow(() => yourObj.InputDataStore(index, "don't care"));
}

или (все должно пройти)

[Test]
[TestCase(5)]
[TestCase(0)]
[TestCase(int.MaxValue)]
[TestCase(int.MinValue)]
public void InvalidIndices(int index)
{
    Assert.Throws<IndexOutOfRangeException>(() => yourObj.InputDataStore(index, "don't care"));
}
0 голосов
/ 22 февраля 2012

Вы также можете использовать кодовый контракт со многими другими преимуществами, такими как статическая проверка кода.Это означает, что вы будете предупреждены в течение «кода времени» о неправильном использовании метода.

public void InputDataStore(int DataStore, string Data)
{
  Contract.Requires(DataStore >= 1 && DataStore <= 4);
  DataStoreContents[DataStore - 1] = Data;
}

Хорошее прочтение здесь: http://devjourney.com/blog/code-contracts-part-1-introduction/

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