如何为Moq显示内部接口?

时间:2015-01-30 10:57:49

标签: c# unit-testing nunit moq internal

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

作为NuGet打包在packages.config中。

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

类型Signatures.InterfaceX对DynamicProxy不可见。无法为无法访问的类型创建代理。将类型设置为public或internal,并使用[assembly:InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]属性标记程序集。

似乎合乎逻辑。我补充道 [assembly:InternalsVisibleTo(“InternalsVisible.DynamicProxyGenAssembly2”)]到签名和结构项目的汇编信息。运行,并有下一个结果:异常:

从程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'输入'Castle.Proxies.IReminiscenceableDataTableProxy'正在尝试实现无法访问的界面。

这是有帮助的,但没有。 只更改异常消息。

如何解决我的问题?

2 个答案:

答案 0 :(得分:67)

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

[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]

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

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

将其更改为:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

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

  

从程序集“ DynamicProxyGenAssembly2 (...)

输入'Castle.Proxies.IReminiscenceableDataTableProxy'

答案 1 :(得分:1)

在定义类的 csproj 文件中添加以下内容。

<ItemGroup>
    <!-- For Moq to mock internal class objects -->
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
      <_Parameter1>DynamicProxyGenAssembly2</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>