如何测试接口方法

时间:2016-03-26 14:49:11

标签: c# unit-testing

interface ITest
{
    void Run();
}

class Test : ITest
{
    void ITest.Run() => Run();
    public int Run()
    {
        //...
    }
}

您好,如何验证ITest.Run()执行Test的“Run”?

3 个答案:

答案 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已被调用是有意义的