0

我已经开始使用 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);
    }
    

错误 1 ​​测试“UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same”失败:预期:与 C:\Users 中的 UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same() 相同。

那么为什么当“预期”和“但是”相同时它仍然抛出异常?

我看到的不同之处在于GetMock使用 Unity 来解决新的 Mock没有的Resolve()依赖项。但我无法解释我自己这个异常的原因。

  1. 解析抽象类型:

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

        var httpContextBaseMock = new Mock<HttpContextBase>();
    

但是,以下对 UnityAutoMoqContainer 的调用会引发异常:

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

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

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

4

1 回答 1

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,它应该有望按预期工作。

希望这可以帮助!

-托马斯

于 2011-09-03T13:32:38.803 回答