Тестовый модуль установки 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);
}