2011-09-03 176 views
0

我已经开始使用UnityAutoMoqContainer Here is the Link 并且我特别在container.GetMock()调用周围有2个以下的问题。通过UnityAutoMoqContainer解决依赖关系

  1. 我期待下面的断言取得成功,但它会引发异常。

    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); 
    } 
    

错误1个测试 'UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same' 失败:预期:同在 UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same()在 C:\用户... ...。

那么为什么当“预期”和“但是”是相同的,它仍然会引发异常?

我看到不同的是,GetMock使用统一解决I,E 解决()依赖性,其中新的模拟没有。但我无法解释我自己造成这种例外的原因。

  1. 解决抽象类型:

    我用Moq.Mock到如下解决抽象类型。

    var httpContextBaseMock = new Mock<HttpContextBase>(); 
    

但是下面的调用UnityAutoMoqContainer抛出该异常:

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

依赖解析失败,类型= “System.Web.HttpContextBase”,名字=“ (没有)”。同时发生异常 :解决。异常是:InvalidOperationException - 无法构造类型为HttpContextBase的 。您必须配置 容器才能提供此值。

问题是为什么容器不便于返回一个模拟抽象类型?

回答

1

AreSame方法测试相同的对象被两个参数引用。当你做

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

创建不同的对象,他们将永远是相同的参考。 automoc容器无法知道您在不使用容器的情况下创建的实例。但是,这将成功:

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

不能从抽象类型创建模拟是一个错误,但应该立即修复。如果你更新到v2.1.0,它应该有希望按预期工作。

希望这会有所帮助!

-Thomas