Mirai Mann Mirai Mann - 2 months ago 19
C# Question

How to do internal interfaces visible for Moq?

I have 3 project in my C# solution.


  • Signatures

  • Structures

  • Tests



Signatures has public and internal interfaces.
Also it has

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


in AssemblyInfo.cs of.

Structures has 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 some unit test for 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.

This was to help, but didn't.
Only change exception message.

How to fix my problem?

Answer

Add both of these attributes to the AssemblyInfo.cs file

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

Then your test project will be able to generate Moq proxies for the interface