Проверка соответствия параметров действия ожидаемым

#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 and valueB ?

2. @JohnathanBarclay может быть, тогда это проблема с фреймом. В производстве valueA и valueB устанавливаются внешними методами, поэтому их значение может измениться, но, возможно, я просто думаю об этом неправильно.

3. Если Foo тестируется, то _someOtherService , _timerManager и _someService являются зависимостями, которые можно подделать. Они должны быть протестированы отдельно и в контексте Foo предполагаемой корректной работы. Вопросы, которые вы должны задать: » Каким должно быть состояние до и после Foo выполнения » и «зависит ли это от разных реализаций зависимостей «, затем напишите свои тесты, чтобы подтвердить эти возможности.

4. @JohnathanBarclay разве нецелесообразно проверять, что Foo вызывает что-то, как ожидалось? В этом случае он вызывает timer.Start() с ожидаемыми параметрами (если бы это было что-то другое, кроме действия, тогда я бы просто проверил, что timer.Start это было вызвано как ожидалось). Это просто сложно, потому что один из параметров timer.Start принимает свои собственные параметры.

5. @gilliduck Вам не следует проверять, что вы передали параметры, которые вы действительно передали, независимо от того, является ли это деталью реализации метода. Ваш тест должен утверждать, что метод выполняет все, что он пытается выполнить. Вы должны убедиться, что после срабатывания таймера фактически произошел какой-либо результат или побочный эффект запуска обработчика.