Цель состоит в том, чтобы провести модульное тестирование метода PUBLIC VOID.
У меня есть издевательская служба, которую вызовет мой тестируемый класс, в цикле for-each с тремя разными параметрами.
Тестируемый класс передает некоторые входные параметры методу SendRequest службы, который выполняется с использованием этих параметров.
Я хочу, чтобы издевательская служба выдавала исключение, когда один из параметров имеет определенное значение, например «abc». Я использую что-то вроде этого:
public class ClassUnderTest
{
private IMyService _myservice;
public ClassUnderTest(IMyService myservice)
{
_myservice = myservice;
}
public void MyMethod()
{
//assume I get those 3 values from somewhere, in here.
var list = new List<string>{"abc","aaa","bbb"};
foreach(var item in list)
{
try
{
_myservice.SendRequest(item);
}
catch(Exception ex)
{
//do some logging and continue calling service with next item in list
}
}
}
}
var myService = new Mock<IMyService>();
myService.Setup(x => x.SendRequest("abc")).Throws<Exception>();
myService.Setup(x => x.SendRequest("aaa"));
myService.Setup(x => x.SendRequest("bbb"));
var classUnderTest = new ClassUnderTest(myService.Object);
classUnderTest.MyMethod();
myService.Verify(x =>x.SendRequest(It.IsAny<string>()), Times.Exactly(2));
Дополнительный контекст: поскольку MyMethod возвращает void, для его проверки я могу полагаться только на тот факт, что мои зависимости вызывались в разных частях кода в этом методе. Например, если перед вызовом службы выполняется проверка на нулевое значение для входных параметров, метод вернется до того, как вызовет службу. Если он пройдет нулевую проверку, будет вызвана служба зависимостей. Я мог бы отслеживать их в результатах покрытия кода (и в режиме отладки).
Когда я запускаю тест, он терпит неудачу, потому что он вызывает службу трижды, но я ожидаю, что вызов произойдет дважды (теперь, возможно, я ошибаюсь, и может быть так, что, хотя предполагается, что он должен вызывать исключение, попытка вызова все еще подсчитывается вызовом Verify и следовательно, я получаю 3 пробега).
Как бы то ни было, при отладке я вижу, что служба никогда не выдает исключение. У меня есть try-catch в цикле for-each, где я хочу вести журнал и продолжать снова вызывать службу со следующим значением. Но я никогда не попаду внутрь блока Catch.
Что я делаю неправильно?
classUnderTest.MyMethod()
вызоветmyService.SendRequest()
с помощью abc? Вы отлаживали и видели? - person Arghya C   schedule 08.10.2015SendRequest
будет вызываться трижды. [2] И исключение, выброшенноеMyService
, здесь не имеет значения, потому что вашеMyMethod
обрабатывает его. Однако необработанные исключения ведут себя по-разному в модульных тестах. - person Arghya C   schedule 08.10.2015