Search code examples
c#unit-testingunity-containermoq

Moq with Unity Container unit testing


below is an example of production code that I am trying to unit test. I am struggling to resolve a dependency to a concrete class that is being used.

public MyClass(IUnityContainer container)
{
    this.unityContainer = container;
}

public string DoWork()
{
     var sender = unityContainer.Resolve<IInterface>();  // how to setup this object
     var json = sender.Send("something");
     var value = serializer.Deserialize<SomeModel>(json);
     return value.url;
}

I want to mock out the IInterface used by this method. How do I set that up in my unit test code? I feel like there is something missing here. this has a smell of an anti-pattern.....


Solution

  • This is the "service locator" antipattern, where you inject your dependency injection container / inversion of control into your logic.

    You should pass the IInterface that it depends on instead, so that you control what instances it can otain. See Dependency Injection container in constructor.

    If you can't refactor the class, you have to injecting the container in your unit test. Set up the container to return an instance (or rather, a mock) of IInterface. Like this:

    public void MyUnitTest()
    {
        IUnityContainer myContainer = new UnityContainer();
        myContainer.RegisterType<IInterface, YourInstance>();
    
        MyClass classUnderTest = new MyClass(myContainer);
        classUnderTest.DoWork();
        
        Assert...
    }
    

    See How to use Unity.RegisterType with Moq? to mock the YourInstance.