Mirai Mann Mirai Mann - 10 months ago 90
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:

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

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=, 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?


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