Представьте, что у вас есть эти интерфейсы:
public interface IOne
{
int Foo();
}
public interface ITwo
{
int Foo(string str);
}
И у вас есть класс, который зависит от вышеуказанных интерфейсов:
public class Some
{
private readonly IOne one;
private readonly ITwo two;
public Some(IOne one, ITwo two)
{
this.one = one;
this.two = two;
}
public void Work()
{
// Uses one and two
}
}
И теперь вы хотите протестировать метод Work()
ивы хотите смоделировать зависимости, вот как:
// Arrange
// Let's set up a mock for IOne so when Foo is called, it will return 5
var iOneMock = new Mock<IOne>();
iOneMock.Setup(x => x.Foo()).Returns(5);
// Let's set up the mock for ITwo when Foo is called with any string,
// it will return 1
var iTwoMock = new Mock<ITwo>();
iTwoMock.Setup(x => x.Foo(It.IsAny<string>())).Returns(1);
var some = new Some(iOneMock.Object, iTwoMock.Object);
// Act
some.Work();
// Assert
// Let's verify iOneMock.Foo was called.
iOneMock.Verify(x => x.Foo());
// Let's verify iTwoMock.Foo was called with string "One" and was called only once
iTwoMock.Verify(x => x.Foo("One"), Times.Once());
В моем примере выше я попытался показать методы, которые принимают аргумент, методы, которые не принимают аргумента, был вызван метод проверки и метод проверки был один раз,Это должно дать вам и представление о доступных вариантах.Есть много других доступных вариантов.Пожалуйста, смотрите документацию Moq для более подробной информации.