Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Having trouble getting started with Moq and Nunit

Tags:

c#

moq

nunit

Banging my head against a wall trying to get a really simple testing scenario working. I'm sure I'm missing something really simple!

Whatever I do, I seem to get the following error from the NUnit gui when running a test against my DLL: System.TypeLoadException : Type 'Castle.Proxies.ITestProxy' from assembly 'DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is attempting to implement an inaccessible interface.

Now I've seen reference to this error in heaps of places when looking in Stack Overflow and elsewhere, but the solution I keep finding doesn't seem to help. And I'm not even using an internal interface at this stage! The solution I see around the place is too put the following line in AssemblyInfo.cs

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

I'm using:

  • Visual Studio 2010 Professional
  • c# 4.0
  • Moq 4.10810.8 Beta (bin deployed)
  • NUnit 2.5.5 (Installed in GAC)

To recreate this error, all I need to do is:

  1. Create a new class library project
  2. Reference Moq and Unit (as above)
  3. Create an interface. I've called my interface ITest, made it public, and it has one method which is 'string TestMethod();'. Am doing this in the local project for simplicity.
  4. Create a class called 'Testing', decorated with [TextFixture] and a test method called 'TestMethod' decorated with [Test]
  5. Build the project, then run NUnit against the resulting dll in the Debug folder.

Here's the contents of my test class

namespace MoqTest {
[TestFixture]
public class Testing {
    [Test]
    public void TestMethod() {

        var testMock = new Mock<ITest>();
        testMock.Setup(x => x.TestMethod()).Returns("String val");
        var xyz = testMock.Object;

        Assert.AreEqual(1, 1);

    }
}

}

---- UPDATE --- After changing Moq version from 4.10810.8 to 4.0.10501.6 everything works fine!

like image 731
Brendan Avatar asked Aug 12 '10 23:08

Brendan


People also ask

Can we use MOQ with NUnit?

The advantages of using Moq is, we can unit test the code successfully without using an external dependency object in the test code. Conclusion: NUnit and Moq are the suitable frameworks for testing the MVC Model layer.

What is the difference between NUnit and MOQ?

NUnit is a unit testing framework for . NET languages, and Moq is the most popular mocking framework for . NET. I assume the reader is familiar with C# projects, Visual Studio IDE, and the Nuget package manager for managing dependencies.


2 Answers

The following test passes for me:

public interface ITest { string TestMethod(); }

public class Testing
{
    [Test]
    public void TestMethod()
    {
        var testMock = new Mock<ITest>();
        testMock.Setup(x => x.TestMethod()).Returns("String val");
        var xyz = testMock.Object;

        Assert.AreEqual(1, 1);
    }
}

If your interface is public and in the same assembly, there really should be no problem. I suspect that you just missed an accessibility keyword somewhere, as a non-public interface does provoke a runtime error because the proxying assembly will be unable to instantiate a type based on it.

Probably the best thing to do is start with the code I've provided and change one thing at a time until it matches your failing code. If you run your test in between each change, I presume you'll find what was missing.

If you do go back to an internal interface, note that your InternalsVisibleTo statement must be in the same assembly as your internal interface, not your test assembly. Also note that if your assembly is strongly named you may need to add a public key fingerprint to your InternalsVisibleTo statement as described in MSDN.

like image 184
ladenedge Avatar answered Oct 20 '22 06:10

ladenedge


Yeah I had the same issue with Moq.4.0.10810.8 for NET40... When I downgraded to version 4.0.10531.7 everything went green again!

like image 21
da2ce7 Avatar answered Oct 20 '22 07:10

da2ce7