В настоящее время у меня есть базовый класс обслуживания, который распространяется на все мои сервисы. Это то, что один из способов выглядеть следующим образом:Как модульный тестовый делегат был получен в методе базового класса?
protected internal virtual T PerformServiceOperationWithExceptionHandling<T>(Func<T> func)
{
try
{
return func.Invoke();
}
...
}
В производных классах я называю метод, как это:
public AddGuestResponse AddGuest(AddGuestRequest addGuestRequest)
{
return PerformServiceOperationWithExceptionHandling(() => AddGuestLogic(addGuestRequest));
}
Я хочу проверить AddGuest и обеспечить «AddGuestLogic» в настоящее время передается в качестве параметр в базовом методе? Как достичь этого с помощью nSubstitute и nUnit. Я не думаю, что это возможно?
==================================================================================================================================== ==
Я в конечном итоге, используя следующий код:
[Test]
public void AddGuest_WhenCalled_PerformsAddGuestLogicWithExceptionHandling()
{
Func<AddGuestResponse> addGuestLogic = null;
_guestService.PerformServiceOperationWithExceptionHandling(Arg.Do<Func<AddGuestResponse>>(arg => addGuestLogic = arg));
var addGuestRequest = new AddGuestRequest();
_guestService.AddGuest(addGuestRequest);
_guestService.ClearReceivedCalls();
addGuestLogic.Invoke();
_guestService.Received().AddGuestLogic(addGuestRequest);
}
_guestService создается в моем методе настройки следующим образом: Substitute.ForPartsOf();
Проблемы, которую я имею что я не могу проверить, чтобы увидеть, если мой метод базового класса получил правильную лямбду выражение. Даже если бы я изменил его в сторону композиции над наследованием (что-то, что я действительно рассматривал), у меня все еще есть одна и та же проблема, т. Е. Потому что два лямбда-выражения, хотя они одинаковы, будут указывать на два разных места памяти. –
Я также согласен с Sunny, если я правильно его понимаю ... например, чтобы одобрить тестирование на основе тестирования на основе взаимодействия на основе тестирования? Хотя я чувствую, что, выполняя это, я тестирую ту же обработку исключений во всех тестах моих сервисов. –
Я добавил пример сервисного теста, в котором показано, как вы можете убедиться, что ваш двойник-сотрудник выполняет логику службы, которая передается ему как Func. Я не думаю, что Sunny предназначалось для дискредитации тестирования на основе взаимодействия. Его точка зрения заключается в том, что тестирование базового класса в изоляции малопригодно, потому что поведение базового класса всегда будет выполняться, взаимодействуя с логикой производного класса. – EagleBeak