Какова цель Mock <> - PullRequest
       2

Какова цель Mock <>

0 голосов
/ 17 октября 2018

Я унаследовал некоторый код, который использует Moq и реализован в коде как:

private Mock<Shape> nativeShape;
private Mock<Document> nativeDoc;
// ...
nativeDoc = new Mock<Microsoft.Office.Interop.Word.Document>();
nativeShape = new Mock<Microsoft.Office.Interop.Word.Shape>();

Git для Moq говорит, как его использовать, но не то, что он делает и почемуЯ мог бы хотеть этого.Какова цель этого?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Используя ваш пример, предположим, что у вас есть объект - назовите его Foo - который требует Shape и Document в конструкторе.В этом случае у вас будет две опции:

  1. Создание фактического Document и фактического Shape, но с использованием данных теста, и отправка этих объектов конструктору во время теста.
  2. Создайте макет Document и макет Shape, используя только те функциональные возможности, которые необходимы для запуска фактически выполненного теста, и отправьте их конструктору для теста.

Если ваши объекты большие и сложные, то первый вариант может стать препятствующим для тестирования, особенно для более крупных проектов, где вы можете не знать внутреннюю работу того, как объекты должны создаваться, или если им требуются определенные параметры (например, закрытые ключи,отпечатки пальцев и т. д.), к которым у вас может не быть доступа.Это действительно становится проблемой, когда вы начинаете использовать внедрение зависимостей.Итак, чтобы обойти это, вы связываете объекты, которые вам нужно обойти, а затем вы создаете фиктивные реализации, которые позволяют вам тестировать их.Конечно, через некоторое время это становится довольно повторяющимся, поэтому Moq существует.

Возвращаясь к примеру, вы можете проверить Foo примерно так:

public void Foo_TestingFoo_DoesBar()
{
    var mockDoc = new Mock<Document>();
    var mockShape = new Mock<Shape>();

    // "implement" the methods you will need during your test
    mockDoc.Setup(...);
    mockShape.Setup(...);

    // Get the "actual" Document and Shape and use them as arguments to the ctor
    var foo = new Foo(mockDoc.Object, mockShape.Object);

    // Do stuff with foo
    foo.DoBar();

    // Verify that these objects were used how you expected them to be
    mockDoc.Verify(...);
    mockShape.Verify(...);
}
0 голосов
/ 17 октября 2018

Mock используется в тестовых случаях, особенно если вы используете Dependency Injection.Если вы не знакомы с Test Driven Development, я настоятельно рекомендую вам ознакомиться с ним.(Но это сам по себе целый поток.) ​​Он позволяет создавать объекты, которые реализуют интерфейс или имитируют существующий класс.Затем вы можете определить, как mocked-объект ведет себя для конкретного теста.Простым примером является тестирование бизнес-объекта, который зависит от другого объекта, такого как компонент уровня доступа к данным.Недавно я создал несколько тестов для бизнес-объекта и издевался над DAL.Все мои тестовые примеры зависели от того, как бизнес-объект обрабатывал различные результаты из DAL (например, ожидаемый набор данных, пустой набор данных и исключение).Это позволило мне протестировать бизнес-логику самостоятельно, без зависимости от DAL или базы данных.Доступно несколько библиотек, которые предоставляют функции имитации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...