c # Ложный интерфейс против ложного класса - PullRequest
0 голосов
/ 11 мая 2018

Я новичок в фреймворке moq в .net. Из моего исследования в Интернете кажется, что есть 2 способа использовать эту платформу. Либо издевайтесь над интерфейсом, либо издевайтесь над конкретным классом. Похоже, при издевательстве над конкретным классом можно смоделировать только метод virtual. В моем случае я просто хочу смоделировать пару методов класса, который реализует интерфейс.

Например, если у нас есть следующее:

public interface Ifoo
{
    int Bar();
}

public class Foo : Ifoo
{
    public virtual int Bar()
    {
        return 0;
    }
}

public class Client
{
    public Client(Ifoo foo)
    {
        var temp = foo.Bar();
    }
}

Теперь, если мне нужно выполнить модульное тестирование клиента, мне нужно передать поддельный объект Ifoo в ctor. В этом случае я должен сделать:

var mock = new Mock<Ifoo>();

или

var mock = new Mock<Foo>();

Имеет ли это значение в моем случае? Каковы плюсы и минусы насмешливого интерфейса против насмешливого класса? На мой взгляд, интерфейс с насмешками всегда является лучшим решением, поскольку насмешка над классом может дать только имитацию метода virtual.

1 Ответ

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

Вот несколько моментов для рассмотрения:

  • Ваш клиент потребляет IFoo, так что это то, что вы должны высмеивать.
  • Если ваш клиент использует конкретный класс, вам следует подумать о рефакторинге вашего клиента, чтобы использовать интерфейс или абстрактный класс вместо того, чтобы соответствовать принципам SOLID.
  • Если ваш клиент использует макет Foo во время вашего теста вместо интерфейса, и он полагается на некоторое немодальное поведение в этом тесте, вы на самом деле не пишете модульный тест, так как тестируете поведение более одной единицы.
  • Если ваш клиент не использует немодальное поведение во время теста, то вы все равно можете просто пропустить макет интерфейса.

tldr: классы должны использовать интерфейсы или абстрактные классы, а не конкретные классы. Тесты должны имитировать интерфейсы или абстрактные классы, а не конкретные классы.

...