#c# #unit-testing #moq
#c# #модульное тестирование #moq
Вопрос:
Я хотел бы проверить, вызывается ли метод с правильными параметрами, но я изо всех сил пытаюсь понять, как их проверить, поскольку параметры являются частью действия, которое передается в другой метод.
Тестируемый модуль:
public void Foo()
{
//other stuff
var valueA = _someOtherService.GetA(); //10
var valueB = _someOtherService.GetB(); //"someValue"
var timer = _timerManager.CreateTimer("someName");
timer.Start(() => _someService.DoStuff(valueA, valueB), TimeSpan.FromMinutes(5));
//other stuff
}
Используя Moq, я не могу понять, как утверждать, что timer.Start
это было вызвано с одним из его параметров не просто быть _someService.DoStuff
, но valueA
и с valueB
правильными значениями, переданными _someService.DoStuff
.
Я могу утверждать, что timer.Start
это было вызвано действием, но помимо этого я испытываю трудности.
public void SomeTest()
{
//arrange
//act
_uut.Foo();
//assert
_mocker.Verify<IActionTimer>(
m => m.Start(It.IsAny<Action>(), It.IsAny<TimeSpan>()), Times.Once));
}
Но просто убедитесь, что любое вызываемое действие не кажется достаточным. В других тестах я могу утверждать, что _someService.DoStuff
это делает то, что я ожидаю, и я также могу утверждать, что timer.Start
делает то, что я ожидаю, но я не могу понять, как проверить, что timer.Start
это вызывается действием, которое соответствует моим ожиданиям.
Комментарии:
1. Зачем вам нужно это проверять? Как можно
_someService.DoStuff
вызвать что-либо, кромеvalueA
andvalueB
?2. @JohnathanBarclay может быть, тогда это проблема с фреймом. В производстве
valueA
иvalueB
устанавливаются внешними методами, поэтому их значение может измениться, но, возможно, я просто думаю об этом неправильно.3. Если
Foo
тестируется, то_someOtherService
,_timerManager
и_someService
являются зависимостями, которые можно подделать. Они должны быть протестированы отдельно и в контекстеFoo
предполагаемой корректной работы. Вопросы, которые вы должны задать: » Каким должно быть состояние до и послеFoo
выполнения » и «зависит ли это от разных реализаций зависимостей «, затем напишите свои тесты, чтобы подтвердить эти возможности.4. @JohnathanBarclay разве нецелесообразно проверять, что
Foo
вызывает что-то, как ожидалось? В этом случае он вызываетtimer.Start()
с ожидаемыми параметрами (если бы это было что-то другое, кроме действия, тогда я бы просто проверил, чтоtimer.Start
это было вызвано как ожидалось). Это просто сложно, потому что один из параметровtimer.Start
принимает свои собственные параметры.5. @gilliduck Вам не следует проверять, что вы передали параметры, которые вы действительно передали, независимо от того, является ли это деталью реализации метода. Ваш тест должен утверждать, что метод выполняет все, что он пытается выполнить. Вы должны убедиться, что после срабатывания таймера фактически произошел какой-либо результат или побочный эффект запуска обработчика.