【问题标题】:Unit Testing Interfaces with MoqMoq 的单元测试接口
【发布时间】:2012-11-27 14:56:15
【问题描述】:

我是最小起订量和单元测试的新手。我一直在进行单元测试,这是以下代码:

private Mock<IServiceAdapter> repository;

    [TestInitialize]
    public void Initialize()
    {
        repository= new Mock<IServiceAdapter>();
    }

[TestMethod()]
    public void SaveTest()
    {
        //Setup 
        string Name = "Name1"; 
        string Type = "1";
        string parentID = null;

        repository.Setup(x => x.Save(Name , Type, parentID)).Returns("Success").Verifiable();

        //Do
        var result = repository.Object.Save(Name , Type, parentID);
        //Assert
        repository.Verify();
    }

我的问题是测试总是会返回我放在 Returns 参数中的字符串,换句话说,它总是会返回“成功”或我写的任何内容。我想那是不对的,因为那不是服务的真实行为。任何人都知道我如何反映我正在尝试测试的“保存”服务的真实行为?所以可以说,如果返回字符串与服务方法不同,那么测试应该失败。

编辑

ServiceAdapter 接口只是一个 Web 服务的包装器,我称之为 REST 服务。这是一个 Web 表单项目。

我正在做类似这篇文章的事情

How to mock a web service

我是否应该使用依赖注入创建类似 FakeController 的东西来使其工作?

【问题讨论】:

    标签: c# asp.net unit-testing interface moq


    【解决方案1】:

    您在此处测试模拟,它没有给您任何东西(因为此模拟未在您的实际应用程序中使用)。在单元测试中,您应该创建和测试您的真实对象,这些对象存在于您的真实应用程序中(即接口实现)。用于模拟被测对象的依赖关系的模拟。

    因此,服务适配器的模拟对于使用该适配器的对象测试很有用,例如一些控制器测试:

    private FooController _controller; // object under test, real object
    private Mock<IServiceAdapter> _serviceAdapter; // dependency of controller
    
    [TestInitialize]
    public void Initialize()
    {
        _serviceAdapter = new Mock<IServiceAdapter>();
        _controller = new FooController(_serviceAdapter.Object);
    }
    
    [TestMethod()]
    public void SaveTest()
    {
        // Arrange
        string name = "Name1"; 
        string type = "1";
        string parentID = null;
    
        _serviceAdapter.Setup(x => x.Save(name , type, parentID))
                       .Returns("Success").Verifiable();
    
        // Act on your object under test!
        // controller will call dependency
        var result =  _controller.Bar(name , type, parentID); 
    
        // Assert
        Assert.True(result); // verify result is correct
        _serviceAdapter.Verify(); // verify dependency was called
    }
    

    【讨论】:

    • 我在这里遗漏了一些东西。我没有控制器(它是网络表单)。我会在问题中提供更多信息。
    • @MorganSoren 控制器只是一个例子。它可以是使用您的服务适配器的任何其他类。我认为 Web 表单不是很容易进行单元测试,通常 MVP 模式用于创建可测试的 Web 表单应用程序。
    • @MorganSoren 这里是关于unit-testing web forms的问题
    • @Preyash 如果 IServiceAdapter 的实现有依赖关系,应该模拟,那么是的,我使用了一些模拟框架进行测试
    • @Preyash 完全是 :) 没有依赖关系 - 没有模拟。你不应该使用真正的依赖,类应该是tested in isolation
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2018-01-26
    相关资源
    最近更新 更多