Метод тестирования с несколькими возможностями метода `Returns`

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

Код в качестве примера:

_mockObj.MockedMethod(Arg.Any<string>(), Arg.Any<string>()).Returns(new objA() { TestProp="bla1" };
_mockObj.MockedMethod(Arg.Any<string>(), Arg.Any<string>()).Returns(new objA() { TestProp="bla2" };
_mockObj.MockedMethod(Arg.Any<string>(), Arg.Any<string>()).Returns(new objA() { TestProp="bla3" };

Что я хочу сделать, так это использовать один метод Test для проверки трех вышеперечисленных вариантов поведения. Возможно ли это или мне нужно написать 3 отдельных метода тестирования?

ИЗМЕНИТЬ

Я обнаружил, что должен использовать TestCaseSourceAttribute. Но теперь я столкнулся с другой «проблемой». Когда у меня много тестовых случаев и один из них не работает, я не могу отследить, какой из тестовых случаев не сработал...


person Ozkan    schedule 30.05.2017    source источник
comment
Вы можете написать один метод, который либо используется тремя тестовыми методами, либо вызывается 3 раза одним тестовым методом, как в обычном коде.   -  person juharr    schedule 30.05.2017
comment
Вы имеете в виду, что я могу написать 3 отдельных Arrange, Act, Asserts в одном методе тестирования?   -  person Ozkan    schedule 30.05.2017
comment
Это один из способов взглянуть на это, но я бы посоветовал написать общий код Arrage, Act и Assert во вспомогательный метод, а затем вызвать его, передавая в разные макеты. Независимо от того, вызываете ли вы это из одного метода тестирования или 3, зависит от вас. Я бы по-прежнему выполнял 3 отдельных метода тестирования, чтобы видеть утверждения/ошибки для каждого из них.   -  person juharr    schedule 30.05.2017


Ответы (2)


Метод != тест. Используя параметры, один метод создает множество тестовых случаев. Например...

[TestCase("bla1")]
[TestCase("bla2")]
[TestCase("bla3")]
public void MyTest(string blaValue)
{
    _mockObj.MockedMethod(Arg.Any<string>(), Arg.Any<string>())
        .Returns(new objA() { TestProp=blaValue };

    // Your test code
}
person Charlie    schedule 30.05.2017
comment
Спасибо, но мой аргумент атрибута на самом деле не является константой времени компиляции. Это объект. Я хотел сделать свой пример максимально простым - person Ozkan; 31.05.2017

Некоторые исследования привели меня к этому: https://stackoverflow.com/a/10687118/1410501

[Test, TestCaseSource(nameof(MyTestCases))]
public void TestMethod(object obj)
{

}

private static readonly object[] MyTestCases =
{
    new object { TestProp="bla1" },
    new object { TestProp="bla2" },
    new object { TestProp="bla3" },
};
person Ozkan    schedule 31.05.2017