interface ITest
{
void Run();
}
class Test : ITest
{
void ITest.Run() => Run();
public int Run()
{
//...
}
}您好,如何验证ITest.Run()执行测试的"Run“?
发布于 2016-03-26 23:14:30
你可以使用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不调用Test的Run时,将正确抛出此错误。但是,正如您所看到的,这样做需要Run方法是虚拟的,这样mock就可以用它自己的实现覆盖它。这可能不是我们想要的。
最终,这个测试没有任何意义。当您对某些东西进行单元测试时,您希望单元测试的是行为,而不是实现。因此,显式实现ITest.Run是否调用对象上的另一个方法对您来说应该无关紧要。您应该只关心调用该方法的行为是否正确。
发布于 2016-03-27 15:26:03
测试界面是最简单的任务!您可以简单地使用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()方法(它是可选的),然后您可以验证是否进行了调用。
希望它能帮上忙!
发布于 2016-03-26 23:06:29
除非您的接口在另一个类中使用,否则验证是否调用Run是没有意义的。(不是实现它的类)。因此,如果您有第二个使用ITest接口的类,那么验证Run是否被调用是有意义的
https://stackoverflow.com/questions/36236683
复制相似问题