通过UnityAutoMoqContainer解决依赖关系

时间:2011-09-03 10:56:16

标签: unit-testing unity-container moq automocking

我已经开始使用UnityAutoMoqContainer Here is the Link  我有以下2个问题,特别是在container.GetMock()调用。

  1. 我希望下面的Assert能够成功,但会引发异常。

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

    错误1测试   'UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same'   失败:预期:与此相同   UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same()in   C:\用户......

    那么为什么当“预期”和“但是”相同时仍然​​会引发异常呢?

    我看到的差异是 GetMock 使用Unity来解析i,e Resolve()依赖关系 new Mock 没有。但我不能解释这个例外的原因。

    1. 解析抽象类型:

      我使用Moq.Mock来解析抽象类型,如下所示。

          var httpContextBaseMock = new Mock<HttpContextBase>();
      
    2. 但是,以下对UnityAutoMoqContainer的调用会引发异常:

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

      依赖项的解析失败,type =   “System.Web.HttpContextBase”,name =“(none)”。发生了异常   while:同时解决。例外是:InvalidOperationException - The   无法构造类型HttpContextBase。你必须配置   容器提供此值。

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

1 个答案:

答案 0 :(得分:1)

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

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

您创建两个不同的对象,它们永远不会是同一个引用。 automock容器无法在不使用容器的情况下了解您创建的实例。但是,这将成功:

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

无法从抽象类型创建模拟是一个错误,但现在应该修复。如果您更新到v2.1.0,它应该可以按预期工作。

希望这有帮助!

-Thomas