c# - 单元测试接口(interface)与最小起订量

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

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

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 参数中的字符串,换句话说,它将始终返回“成功”或我在其位置写入的任何内容。我想那是不对的,因为那不是服务的真实行为。任何人都知道如何反射(reflect)我要测试的“保存”服务的真实行为?所以可以说,如果返回字符串与服务方法不同,则测试应该失败。

已编辑

ServiceAdapter 接口(interface)只是 Web 服务的包装器,我称之为 REST 服务。这是一个 Web 窗体项目。

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

How to mock a web service

我是否应该创建类似带有依赖注入(inject)的 FakeController 的东西来让它工作?

最佳答案

你在这里测试 mock,这不会给你任何东西(因为这个 mock 没有在你的真实应用程序中使用)。在单元测试中,您应该创建和测试您的真实对象,这些对象存在于您的真实应用程序中(即接口(interface)实现)。 Mocks 用于模拟被测对象的依赖关系。

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

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
}

关于c# - 单元测试接口(interface)与最小起订量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13796817/

相关文章:

python - 为什么我收到 KeyError : "Django settings doesn' t define RESOLVER"?

unit-testing - polymer 单元测试 : dom-repeat is not rendered when "ready" is called

c# - 没有 setter 的模拟对象

c# - 返回对象时如何抛出异常?

asp.net - 当 IIS 已经处理请求并发时,为什么要使用异步 Controller ?

c - 单元测试运行配置

C# 控制台应用程序命令 session 历史记录

C# 如何将一个对象序列化/反序列化到/从 Dictionary<string,Object> 以将其保存/加载到 Couchbase.lite

asp.net - 即时生成 Powerpoint 文件

c# - 动态单选按钮 CheckedChanged 事件不会触发