web-dev-qa-db-fra.com

Comment rendre les interfaces internes visibles pour Moq?

J'ai 3 projets dans ma solution C #.

  • Signatures
  • Structures
  • Les tests

Signatures possède des interfaces publiques et internes. Il a également

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

dans AssemblyInfo.cs de.

Structures a des classes publiques et internes et

  [Assembly: InternalsVisibleTo("Tests")]

dans AssemblyInfo.cs de.

Les tests ont la source suivante:

<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>

en tant que packages NuGet dans packages.config.

J'ai écrit un test unitaire pour l'interface interne de Signatures et une classe interne de Structures. Exécuter, et avait le résultat suivant: exception:

Type Signatures.InterfaceX n'est pas visible pour DynamicProxy. Impossible de créer un proxy pour les types qui ne sont pas accessibles. Rendez le type public ou interne et marquez votre assembly avec [Assembly: InternalsVisibleTo (InternalsVisible.ToDynamicProxyGenAssembly2)]).

Semble logique. J'ai ajouté [Assembly: InternalsVisibleTo ("InternalsVisible.DynamicProxyGenAssembly2")] aux informations d'assemblage des projets Signatures et Structures. Exécuter, et avait le résultat suivant: exception:

Tapez 'Castle.Proxies.IReminiscenceableDataTableProxy' dans l'assembly 'DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null' tente d'implémenter une interface inaccessible.

C'était pour aider, mais pas. Changer uniquement le message d'exception.

Comment résoudre mon problème?

37

Le message de correction suggéré utilise un champ const/static pour le nom de l'assembly:

[Assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]

Vous avez utilisé une chaîne qui ne correspond pas au nom de l'assembly:

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

Changez-le en:

[Assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

Vous pouvez voir le nom réel de l'assembly (qui devrait apparaître dans InternalsVisibleTo) dans votre message d'erreur:

Tapez 'Castle.Proxies.IReminiscenceableDataTableProxy' dans Assembly 'DynamicProxyGenAssembly2 (...)

70
k.m