首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试接口方法

如何测试接口方法
EN

Stack Overflow用户
提问于 2016-03-26 22:49:11
回答 3查看 1.8K关注 0票数 0
代码语言:javascript
复制
interface ITest
{
    void Run();
}

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

您好,如何验证ITest.Run()执行测试的"Run“?

EN

回答 3

Stack Overflow用户

发布于 2016-03-26 23:14:30

你可以使用Moq这样的模拟框架来测试它:

代码语言:javascript
复制
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
    }
}

然后,测试将如下所示:

代码语言:javascript
复制
// 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不调用TestRun时,将正确抛出此错误。但是,正如您所看到的,这样做需要Run方法是虚拟的,这样mock就可以用它自己的实现覆盖它。这可能不是我们想要的。

最终,这个测试没有任何意义。当您对某些东西进行单元测试时,您希望单元测试的是行为,而不是实现。因此,显式实现ITest.Run是否调用对象上的另一个方法对您来说应该无关紧要。您应该只关心调用该方法的行为是否正确。

票数 1
EN

Stack Overflow用户

发布于 2016-03-27 15:26:03

测试界面是最简单的任务!您可以简单地使用Typemock Isolator (不需要虚拟方法)来做这件事,看一下:

代码语言:javascript
复制
 [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()方法(它是可选的),然后您可以验证是否进行了调用。

希望它能帮上忙!

票数 1
EN

Stack Overflow用户

发布于 2016-03-26 23:06:29

除非您的接口在另一个类中使用,否则验证是否调用Run是没有意义的。(不是实现它的类)。因此,如果您有第二个使用ITest接口的类,那么验证Run是否被调用是有意义的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36236683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档