Как утверждать истину и ложь в однопараметрическом методе теста - PullRequest
0 голосов
/ 11 апреля 2020

Я новичок в модульном тестировании и довольно запутан в тестировании истинных или ложных результатов, возвращаемых методом, основанным на параметре. В настоящее время я использую NUnit и MoQ, ниже мой код. Тест будет выполняться три раза со значениями A, B, C для каждого времени соответственно.

[Test]
    public void IFoo_Return_True_With_A_As_Input([Values("A", "B", "C")]string value){
        var mock = new Mock<IFoo>();
        // setup
        mock.Setup(foo => foo.DoSomething("A")).Returns(true);

        // Arrage
        Func<string, bool> action = (_) => mock.Object.DoSomething(_);

        // Act
        bool result = action(value);

        // Assert
        Assert.That(result, /* ??? */);
    }

У меня есть метод, который получает значение через параметр IFoo.DoSomething , и он будет вернуть true , если значение параметра A , в противном случае он вернет false . Я не знаю, как представить этот вид теста в одном тесте.

Я думал, что не могу использовать несколько утверждений (я имею в виду одно утверждение для истины, а другое для ложных), потому что результат будет оцениваться как истинный или ложный в каждом тесте. Я думал, что мог бы использовать TestCase с ExpectedResult ИЛИ Предположим, , прежде чем утверждать ИЛИ написать два теста (один для значения A и другой для других значений), но я хотел бы знать, есть ли у нас какие-либо изощренные способы добиться такого рода теста.

Я ожидаю, что будет пройдено три теста с оценкой true или false, полагаясь на предоставленное значение в одном тесте. Пожалуйста, сообщите мне, если я не иду в правильном направлении по поводу модульного теста.

Настройка макета - это способ, которым я представляю реализацию метода IFoo.DoSomething . Его логика c возвращает true, если значение равно A, и false, если иначе.

1 Ответ

0 голосов
/ 11 апреля 2020

Что вы на самом деле пытаетесь проверить здесь? Что макет, который вы установили, которым вы полностью управляете, будет условно возвращать истину или ложь?

Ваша текущая установка сделает это - .DoSomething("A") вернет истину и все другие строковые значения будут запущены в DoSomething вернет значение по умолчанию bool (false). Если вы не настроите метод, он вернет значение по умолчанию возвращаемого типа.

Вы можете утверждать это для случаев, которые вы указали в одном утверждении:

Assert.That(result, Is.EqualTo(value.Equals("A")))

... но я не уверен, почему ты это сделал. Вы не тестируете свой код, вы тестируете Moq / ваши фиктивные настройки.

Обычно я ожидаю, что модульный тест протестирует конкретную реализацию (например, Foo). Любые зависимости, в которых нуждается Foo (например, IBar), будут проверяться.

Скажем, у вас есть конкретная реализация Foo, которая реализует IFoo.DoSomething(string). Вы бы написали 2 метода тестирования, что-то вроде следующего:

public void DoSomething_A_ReturnsTrue()

и

public void DoSomething_NotA_ReturnsFalse()

Каждый из них будет делать все необходимые настройки для создания экземпляра Foo, вызывать DoSomething со значением, которое соответствует описанию теста, и, наконец, одно утверждение, которое соответствует ожидаемому результату теста (true или false).

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