Question

I have started using the UnityAutoMoqContainer Here is the Link and I have below 2 questions in particularly around container.GetMock() call.

  1. I would expect the below Assert to succeed however it throws an exception.

    private UnityAutoMoqContainer container;
    
    [SetUp]
    public void SetUp()
    {
        container = new UnityAutoMoqContainer();
    }
    
    [Test]
    public void Are_mocks_Same(){
    
        var serviceMock = new Mock<IService>();
        var getMock = container.GetMock<IService>();             
        Assert.AreSame(getMock, serviceMock);
    }
    

Error 1 Test 'UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same' failed: Expected: same as at UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same() in C:\Users…….

So why when "Expected" and the "But was" are same it still throws an exception?

The difference I see is that GetMock uses the Unity to resolve i,e Resolve() dependencies where the new Mock doesn’t. But I cannot explain my self the cause of this exception.

  1. Resolving abstract types:

    I use the Moq.Mock to resolve an abstract type as below.

        var httpContextBaseMock = new Mock<HttpContextBase>();
    

However the below call to the UnityAutoMoqContainer throws the exception:

        var mock = container.GetMock<HttpContextBase>();

Resolution of the dependency failed, type = "System.Web.HttpContextBase", name = "(none)". Exception occurred while: while resolving. Exception is: InvalidOperationException - The type HttpContextBase cannot be constructed. You must configure the container to supply this value.

The question is why the container does not facilitate to return a mocked abstract type?

Was it helpful?

Solution

The AreSame method tests that the same object are referenced by both arguments. When you do

var serviceMock = new Mock<IService>();
var getMock = container.GetMock<IService>();
Assert.AreSame(getMock, serviceMock);

you create two different objects and they will never be the same reference. There is no way the automock container can know about the instance you created without using the container. However, this will succeed:

var mock1 = container.GetMock<IService>();
var mock2 = container.GetMock<IService>();
Assert.AreSame(mock1, mock2);

Not being able to create mocks from abstract types is a bug, but should be fixed now. If you update to v2.1.0 it should hopefully work as expected.

Hope this helps!

-Thomas

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top