chevron-thin-right chevron-thin-left brand cancel-circle search youtube-icon google-plus-icon linkedin-icon facebook-icon twitter-icon toolbox download check linkedin phone twitter-old google-plus facebook profile-male chat calendar profile-male
Welcome to Typemock Community! Here you can ask and receive answers from other community members. If you liked or disliked an answer or thread: react with an up- or downvote.
0 votes
i tried to mock an internal abstract class but got an exception with "Access is denied" message :( . Any ideas on how to fix this? Thanks.
asked by patrotter (800 points)

8 Answers

0 votes
Hi and welcome to the forum.
Sure you can do this.
Have a look here

From TypeMock.NET documentation:
In .NET 2.0 it is possible to mock the internal interfaces if you give TypeMock the correct permissions, as follows:
In the AssemblyInfo of the internal interface add
[assembly: InternalsVisibleTo("DynamicMockAssembly")]
answered by ohad (35.4k points)
0 votes
I had tried that but because the assembly has a strong name you need a key for that (i.e. [assembly: InternalsVisibleTo("DynamicMockAssembly, <key number>")])
answered by patrotter (800 points)
0 votes

Thank you for your reply.

Some more information on trying this. When I tried to compile with the line added to assembler info I got the following compilation error.

"Friend assembly reference 'DynamicMockAssembly' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations."

I tried getting the strong name for "DynamicMockAssembly" but could not find the file anywhere on my system.

Thanks again.
answered by patrotter (800 points)
0 votes

I did try it for the type mock assembly

"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("TypeMock, PublicKey=0024000...)]"

the code compiled but the test was unable to mock the internal abstract class.

answered by patrotter (800 points)
0 votes

The reason that DynamicMockAssembly is denied access is because it is not given a strong name when create by the TypeMock assembly. This means any assembly with a strong name will not give visible internal priviliges to DynamicMockAssembly.

The work around that I have done is to give my test assembly visible internal priviliges to the assembly I want to test. In my test assembly I create a concrete class derived from my internal abstract class and mock that.

That seems to work.


Peter Trotter.
answered by patrotter (800 points)
0 votes
I found out that our documentation is not complete in this issue. :(
Thanks for pointing the problem, We will fix it.

Here are the steps you should take to make it work:
Note that the order is significant.

Sign your test assembly
Build the test assembly.
Extract the public key of the test assembly like this:
sn.ex -Tp MySignedTestAssembly.dll
This will write the public key to the command line output.
Add this lines to the assembly you want to test:
[assembly: InternalsVisibleTo("DynamicMockAssembly=0024..")] //DynamicMockAssembly key
[assembly: InternalsVisibleTo("MySignedTestAssembly, PublicKey=1234..")]  //Your test assembly key

The PublicKey of MySignedTestAssembly should be the extracted key from sn.exe output.
Build again.

After all these steps you should be able to mock internal abstract classes
and interfaces without creating the concrete implementation.
answered by ohad (35.4k points)
0 votes

Thanks for looking into this. Just one question - how do I get the key for the dynamic mock assembly. I tried using the key for my testing assembly but that did not seem to work.

Thank you for your help.
answered by patrotter (800 points)
0 votes
You can get the key for DynamicMockAssembly in the example at the help

[assembly: InternalsVisibleTo("DynamicMockAssembly,PublicKey=0024000004800000940000000602000000

:arrow: You can use instead:
[assembly: InternalsVisibleTo(MockManager.DynamicMocksAssembly)] 

But than you'll have to reference TypeMock from your tested assembly
(Not nice) :?
answered by ohad (35.4k points)