我已经开始使用UnityAutoMoqContainer Here is the Link 我有以下2个问题,特别是在container.GetMock()调用。
我希望下面的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' 失败:预期:与此相同 UnityAutoMoq.Tests.UnityAutoMoqContainerFixture.Are_mocks_Same()in C:\用户......
那么为什么当“预期”和“但是”相同时仍然会引发异常呢?
我看到的差异是 GetMock 使用Unity来解析i,e Resolve()依赖关系 new Mock 没有。但我不能解释这个例外的原因。
解析抽象类型:
我使用Moq.Mock来解析抽象类型,如下所示。
var httpContextBaseMock = new Mock<HttpContextBase>();
但是,以下对UnityAutoMoqContainer的调用会引发异常:
var mock = container.GetMock<HttpContextBase>();
依赖项的解析失败,type = “System.Web.HttpContextBase”,name =“(none)”。发生了异常 while:同时解决。例外是:InvalidOperationException - The 无法构造类型HttpContextBase。你必须配置 容器提供此值。
问题是为什么容器不便于返回模拟的抽象类型?
答案 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