Насколько я понимаю, я могу проверить, что вызов метода произойдет, если я вызову метод более высокого уровня, то есть:
public abstract class SomeClass()
{
public void SomeMehod()
{
SomeOtherMethod();
}
internal abstract void SomeOtherMethod();
}
Я хочу проверить, что если я позвоню, SomeMethod()
то я ожидаю, что SomeOtherMethod()
это будет называться.
Правильно ли я считаю, что такого рода тесты доступны для насмешки?
Нет, фиктивное тестирование предполагает, что вы используете определенные тестируемые шаблоны проектирования, одним из которых является внедрение. В вашем случае вы будете тестировать
SomeClass.SomeMethod
иSomeOtherMethod
должны быть реализованы в другом объекте, который должен быть сопряжен.Ваш
Someclass
конструктор будет выглядеть такNew(ISomeOtherClass)
. Затем вы высмеиваетеISomeOtherClass
и устанавливаете ожиданиеSomeOtherMethod
вызова и проверяете ожидание.источник
Несмотря на то, что я согласен с тем, что ответ @ Paul - рекомендуемый путь, я просто хочу добавить один альтернативный путь, который обеспечивается самим
moq
собой.Так
SomeClass
какabstract
это действительно издевательство, ноpublic void SomeMehod()
это не так. Суть в том, чтобы найти способ смоделировать и каким-то образом вызвать этот метод, а затем с помощьюCallBase
распространения передать вызовSomeOtherMethod()
. Это может звучать как взломать, но это просто по сути. Это может быть использовано в том случае, если предложенный рефакторинг невозможен.Затем вы можете настроить
DummyMethod()
передачу вызова, установивCallBase
флажок.источник