Вы могли тест это с помощью насмешливых рамок как Moq:
public interface ITest
{
void Run();
}
public class Test : ITest
{
void ITest.Run() => Run();
public virtual int Run()
{
return 1; // doesn’t matter, will be replaced by our mock
}
}
тест будет выглядеть следующим образом:
// arrange
Mock<Test> mock = new Mock<Test>();
mock.CallBase = true;
mock.Setup(t => t.Run()).Returns(1);
// act
ITest test = mock.Object;
test.Run();
// assert
mock.Verify(t => t.Run(), Times.Once());
Это правильно бросает, когда ITest.Run
не вызывает Run
из Test
. Однако, как вы можете видеть, для этого требуется, чтобы метод Run
был виртуальным, чтобы макет мог перезаписать его своей собственной реализацией. Это может быть нежелательно.
И, в конечном счете, этот тест не имеет никакого смысла. Когда вы что-то тестируете, вы хотите, чтобы блок тестировал поведение , а не реализацию. Поэтому для вас не имеет значения, вызывает ли явная реализация ITest.Run
другой метод для объекта. Вы должны только заботиться о том, чтобы поведение вызова этого метода было правильным.
Вы можете использовать возвращаемое значение 'Run', или вы можете что-то напечатать, вы можете отлаживать ... есть несколько способов сделать это ... – Ian
Я хочу сделать что-нибудь вроде mock.Verify (m => m.Run(), Times.Once()); Но я не понимаю, как я могу это сделать. – Serg046
Это зависит от насмешливой структуры, которую вы используете. Итак, можете ли вы указать, что вы сейчас используете? –