Юнит тест с несколькими интерфейсами - PullRequest
0 голосов
/ 21 мая 2018

У меня есть проект Web API со следующим классом обслуживания, вызываемым из API Controller.Я хочу написать тестовый блок для приведенного ниже класса, используя Moq Framework.Как я могу построить несколько интерфейсов, используя Moq?Если это невозможно с помощью Moq, есть ли другие рамки?

public class MyService : IMyService
{
    private readonly IInterface1 _interface1;
    private readonly IInterfaces2 _interface2;
    private readonly IInterface3 _interface3;

    public MyService(IInterface1 interface1,IInterface2 interface2,IInterface3 interface3)
    {
        _interface1=interface1;
        _interface2=interface2;            
        _interface3=interface3;
    }

    public SomeModel MyMethod1(1Model model)
    {
        //do something here.... 
    }

    public SomeMode2 MyMethod2(Model2 model)
    {
        //do something here.... 
    }

    public SomeMode3 MyMethod3(Model3 model)
    {
        //do something here.... 
    }
}

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Представьте, что у вас есть эти интерфейсы:

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 для более подробной информации.

0 голосов
/ 21 мая 2018

Вы можете использовать AutoMoq для решения инъекций зависимостей.

var mocker = new AutoMoqer();
var myService = mocker.Create<MyService>();
var interface1 = mocker.GetMock<IInterface1>();
...