Тестовый модуль установки Moq

У меня есть простой метод, как:

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 утверждение, которое почти так же, как весь метод?

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 выполняет некоторую обработку, которая зависит от ввода-вывода и которую очень трудно проверить самостоятельно. Тогда издевательство 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);
}
Другие вопросы по тегам