Search code examples
c#unit-testingnunitmoqinternals

How to do internal interfaces visible for Moq?


I have 3 projects in my C# solution.

  • Signatures
  • Structures
  • Tests

Signatures have public and internal interfaces. Also, it has

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

in AssemblyInfo.cs of.

Structures have public and internal classes and

  [assembly: InternalsVisibleTo("Tests")]

in AssemblyInfo.cs of.

Tests has next source:

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

as NuGet packages in packages.config.

I wrote an unit test for the internal interface from Signatures and internal class from Structures. Run, and had next result: exception:

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.

Seems logical. I added

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

to assembly info of Signatures and Structures projects. Run, and had next result: exception:

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

I expected it would help but it didn't. It only changed the exception message.

How to fix my problem?


Solution

  • In .NET 5, the following can be added to .csproj

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

    Source: https://github.com/dotnet/sdk/pull/3439

    Source: https://stackoverflow.com/a/66055829/4503491