【问题标题】:Moq setup unit test起订量设置单元测试
【发布时间】:2017-04-23 23:56:01
【问题描述】:

我有一个简单的方法,比如:

public class MyService : IMyService
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}

public interface IMyService
{
    int Add(int x, int y);
}

我为该方法编写了一个单元测试:

public void PassingTest()
{
    var mock = new Mock<IMyService>();

    mock.Setup(x => x.Add(It.IsAny<int>(), It.IsAny<int>())).Returns<int, int>((x, y) => { return x + y; });

    var svc = mock.Object;

    var result = svc.Add(3, 3);
    var result2 = svc.Add(2, 5);
    result.Should().Be(6);
    result2.Should().Be(7);
}

这段代码可以吗?为什么一定要写Returns和整个方法几乎一样的语句?

【问题讨论】:

  • 只有在 IMyService 被用作您想要测试的另一个类的依赖项时,您才会这样做。如果IMyService 是正在测试的系统,那么您不会模拟您正在尝试测试的系统。您使用目标类的实际实例

标签: c# .net unit-testing moq xunit


【解决方案1】:

只有当IMyService 被用作您想要测试的另一个类的依赖项时,您才会这样做。如果IMyService 是正在测试的系统,那么您不会模拟您正在尝试测试的系统。您使用目标类的实际实例。

让我们举一个非常简单的例子,我们有一个这样的类。

public class SomeClass {
    public SomeClass(IMyService service) {
        this.service = service;
    }
    private readonly IMyService service;

    public int SomeMethodThatUsesMyService(int input) {
        int someConstant = 10;

        var result = service.Add(someConstant, input);
        return result;
    }
}

如果IMyService 的实现做了一些依赖于 IO 的处理并且很难单独测试。然后,模拟 IMyService 对尝试测试该类是有意义的。

[Fact]
public void Given_Input_SomeMethodThatUsesMyService_Should_Increase_By_Ten() {
    //Arrange
    var expected = 14;

    var mock = new Mock<IMyService>();

    mock.Setup(x => x.Add(It.IsAny<int>(), It.IsAny<int>())).Returns<int, int>((x, y) => { return x + y; });

    var svc = mock.Object;

    var sut = new SomeClass(svc);

    //Act
    var result = sut.SomeMethodThatUsesMyService(4);

    //Assert
    result.Should().Be(expected);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多