Подтвердить что ты не робот

Как сделать внутренние интерфейсы видимыми для Moq?

У меня есть 3 проекта в моем решении С#.

  • Подписи
  • Структуры
  • Испытания

Подписи имеют общедоступные и внутренние интерфейсы. Также он имеет

  [assembly: InternalsVisibleTo("Structures")]
  [assembly: InternalsVisibleTo("Tests")]

в AssemblyInfo.cs.

Структуры имеют общедоступные и внутренние классы и

  [assembly: InternalsVisibleTo("Tests")]

в AssemblyInfo.cs.

Тесты имеют следующий источник:

<packages>
  <package id="Moq" version="4.2.1409.1722" targetFramework="net45" />
  <package id="NUnit" version="2.6.4" targetFramework="net45" />
  <package id="NUnitTestAdapter" version="1.2" targetFramework="net45" />
</packages>

как пакеты NuGet в пакетах .config.

Я написал несколько unit test для внутреннего интерфейса из Signatures и внутреннего класса из Structures. Запуск и следующий результат: исключение:

Тип Signatures.InterfaceX не отображается для DynamicProxy. Невозможно создать прокси-сервер для не доступных типов. Сделайте тип общедоступным или внутренним и отметьте свою сборку атрибутом [assembly: InternalsVisibleTo (InternalsVisible.ToDynamicProxyGenAssembly2)].

Кажется логичным. я добавил [сборка: InternalsVisibleTo ( "InternalsVisible.DynamicProxyGenAssembly2" )] для сборки информации о проектах подписи и структуры. Запуск и следующий результат: исключение:

Тип 'Castle.Proxies.IReminiscenceableDataTableProxy' из сборки 'DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null' пытается реализовать недоступный интерфейс.

Это должно было помочь, но не помогло. Измените только сообщение об исключении.

Как исправить мою проблему?

4b9b3361

Ответ 1

В предлагаемом сообщении об ошибке используется поле const/static для имени сборки:

[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]

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

[assembly: InternalsVisibleTo("InternalsVisible.DynamicProxyGenAssembly2")] 

Измените его на:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

В сообщении об ошибке вы можете увидеть фактическое имя сборки (которое должно появиться в InternalsVisibleTo):

Введите 'Castle.Proxies.IReminiscenceableDataTableProxy' из сборки ' DynamicProxyGenAssembly2 (...)