interface ITest
{
void Run();
}
class Test : ITest
{
void ITest.Run() => Run();
public int Run()
{
//...
}
}
您好,如何验证ITest.Run()执行Test的“Run”?
答案 0 :(得分:1)
你可以使用像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
的{{1}}时,这会正确抛出。但是,正如您所看到的,执行此操作需要Test
方法是虚拟的,以便模拟可以使用自己的实现覆盖它。这可能不是理想的。
最终,该测试没有任何意义。当您对某些内容进行单元测试时,您希望对行为进行单元测试,而不是实现。因此,显式实现Run
是否在对象上调用另一个方法并不重要。您应该只关心调用该方法的行为是否正确。
答案 1 :(得分:1)
测试界面是最简单的任务! 您可以使用Typemock Isolator(无需虚拟方法)来执行此操作,请查看:
[TestMethod, Isolated]
public void TestRun()
{
//Arrange
var fake = Isolate.Fake.Instance<ITest>();
Isolate.WhenCalled(() => fake.Run()).CallOriginal();
//Act
fake.Run();
//Assert
Isolate.Verify.WasCalledWithAnyArguments(() => fake.Run());
}
您正在模拟界面,然后将行为设置为Run()方法(它是可选的),毕竟您可以验证是否已进行调用。
希望它有所帮助!
答案 2 :(得分:0)
除非您的接口在另一个类中使用,否则验证是否调用Run是没有意义的。 (不是实现它的类)。因此,如果您有第二个类使用您的ITest接口,那么验证Run已被调用是有意义的