如何做到内部接口对Moq可见?

问题描述 投票:0回答:4

我的 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 对 DynamicProxy 不可见。无法为不可访问的类型创建代理。将类型设置为公共或内部,并使用 [程序集:InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)] 属性标记您的程序集。

看起来合乎逻辑。我添加了

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

签名和结构项目的装配信息。运行,得到下一个结果:异常:

程序集“DynamicProxyGenAssembly2,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”中的类型“Castle.Proxies.IReminiscenceableDataTableProxy”正在尝试实现无法访问的接口。

我原以为会有帮助,但没有。 它仅更改了异常消息。

如何解决我的问题?

c# unit-testing nunit moq internals
4个回答
112
投票

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

[assembly: InternalsVisibleTo(InternalsVisible.ToDynamicProxyGenAssembly2)]

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

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

更改为:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 

您可以在错误消息中看到实际的程序集名称(应出现在

InternalsVisibleTo
中):

从程序集“DynamicProxyGenAssembly2”中键入“Castle.Proxies.IReminiscenceableDataTableProxy”(...)


13
投票

在 .Net Core / .NET 5 中,您还可以将用户 DanKodi 的答案与 this 文章结合起来,这样您就不需要在任何地方设置

assembly
属性。

只需编辑包含要测试的代码的生产代码 .proj 文件,如下所示:

<ItemGroup>

    <!-- Make assembly visible to test assembly -->
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>$(AssemblyName).Tests</_Parameter1>
    </AssemblyAttribute>

    <!-- Make assembly usable for Moq, so Moq an other test code is able to instanciate objects of 'internal' classes -->
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
        <_Parameter1>DynamicProxyGenAssembly2</_Parameter1>
    </AssemblyAttribute>

</ItemGroup>

这会执行以下操作:

  • 它使程序集对包含测试的项目可见(如 只要测试项目的名称是你想要的项目名称 使用“.Tests”后缀进行测试)
  • 它使
    Moq
    (和其他测试代码)能够实例化该测试项目的内部类

7
投票

将以下内容添加到定义类的项目中的 csproj 文件中。

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

5
投票

在.NET 5中,可以将以下内容添加到.csproj

<ItemGroup>
  <InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>

来源:https://github.com/dotnet/sdk/pull/3439

来源:https://stackoverflow.com/a/66055829/4503491

© www.soinside.com 2019 - 2024. All rights reserved.