首页 文章

如何为Moq显示内部接口?

提问于
浏览
34

我的C#解决方案中有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>

在packages.config中作为NuGet包 .

我从Signatures和Structures的内部类中为内部接口编写了一些单元测试 . 运行,并有下一个结果:异常:

Type Signatures.InterfaceX is not visible to DynamicProxy. Can not create proxy for types that are not accessible. Make the type public, or internal and mark your assembly with [assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)] attribute.

似乎合乎逻辑 . 我将[assembly:InternalsVisibleTo(“InternalsVisible.DynamicProxyGenAssembly2”)]添加到Signatures and Structures项目的装配信息中 . 运行,并有下一个结果:异常:

Type 'Castle.Proxies.IReminiscenceableDataTableProxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is attempting to implement an inaccessible interface.

这是有帮助的,但没有 . 仅更改异常消息 .

如何解决我的问题?

1 回答

  • 62

    建议的修复消息使用const / static字段作为程序集名称:

    [assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]
    

    您使用的字符串与程序集名称不对应:

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

    将其更改为:

    [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
    

    您可以在错误消息中看到实际的程序集名称(应显示在 InternalsVisibleTo 中):

    从程序集'DynamicProxyGenAssembly2(...)输入'Castle.Proxies.IReminiscenceableDataTableProxy'

相关问题