Поддельные сборки показывают предупреждения при создании прокладок для интерфейса и заглушек для закрытых типов

У меня есть сборка, сконфигурированная с постом CI, в котором выполняются некоторые тесты. Несмотря на успешное выполнение тестов, сборка отображает предупреждения:

: Невозможно создать заглушку для StructuremapMvc: тип запечатан.: Невозможно сгенерировать прокладку для IUnitOfWork: тип является интерфейсом.: Невозможно создать shim для Repository.IRepository`1: тип является интерфейсом.

и так далее.

Я использую общий шаблон хранилища вместе с Unit Of Work. Я добавил поддельные сборки для моего проекта MVC WebApi (который использует внедрение зависимостей с использованием StructureMap) и проекта данных, который содержит мои репозитории и UnitOfWork. Я исследовал эту ошибку и, кажется, несколько убежден, что это может быть связано с ограничениями поддельных сборок, но я должен быть абсолютно уверен, что я не делаю ничего плохого

2 ответа

Способ, которым я избавился от этих предупреждений, заключался в создании только необходимых прокладок. Я добавил следующее в файл конфигурации подделок.

  <ShimGeneration>
    <Clear/>
    <Add FullName="ATypeToShim!"/>
    <Add FullName="AnotherTypeToShim!"/>
  </ShimGeneration>

! в конце фильтра это делает точное совпадение с учетом регистра.

Для заглушек я только заглушаю интерфейсы, так что это легко:

<StubGeneration>
  <Clear />
  <Add Interfaces ="true"/>
</StubGeneration>

Здесь есть больше деталей: http://msdn.microsoft.com/en-us/library/hh708916.aspx

На самом деле это не ограничение подделок, но на самом деле это не ошибка. То, что вам нужно знать, это то, что окурки и прокладки.

Заглушки просты: это класс, который реализует или расширяет некоторый класс, переопределяя каждый метод свойством делегата и флагом, определяющим, должен ли он вызывать базовый класс впоследствии (примечание: этот флаг предназначен для всей заглушки, а не для метода), Вы используете их для внедрения зависимостей, так как они позволяют вам размещать всю логику в лямбдах в коде, а не где-то в сгенерированном классе. Поскольку они расширяют неинтерфейсы, запечатанные классы не могут быть заглушены.

Прокладки являются более сложными, потому что они применяются к любому экземпляру указанного типа. Не уверен, как именно это делается, но для вас важно то, что, поскольку у интерфейса не может быть экземпляра, у него не может быть прокладки. Это нормально, так как именно здесь вы должны использовать заглушку. Они опасны, потому что с помощью прокладки вы переопределяете результат функции в пределах всего контекста shims, и это почти исключительно, когда что-то ломается, к которому у вас нет доступа - что-то, что было бы лучше внедрить.

Так что я не буду беспокоиться о предупреждениях. Они на самом деле не о чем-то важном, просто чтобы убедиться, что вы знаете, что происходит.

Другие вопросы по тегам