模拟 UnityContainer RegisterType 会导致系统不受支持异常
本文关键字:支持 异常 系统 UnityContainer RegisterType 模拟 | 更新日期: 2023-09-27 18:30:34
嗨,我
很难嘲笑IUnityContainer,特别是我试图查看是否调用了寄存器类型。这是我尝试测试的方法:
private readonly IUnityContainer _container;
public InjectorContainer(IUnityContainer container)
{
_container = container;
}
public void RegisterType(InjectorServiceModel dependencyService)
{
_container.RegisterType(dependencyService.From, dependencyService.To);
}
这是我的 Unity 测试类:
private Mock<IUnityContainer> _unitContaineMock;
private InjectorContainer _injectorContainer;
[TestInitialize]
public void Initializer()
{
_unitContaineMock = new Mock<IUnityContainer>();
_injectorContainer = new InjectorContainer(_unitContaineMock.Object);
}
[TestMethod]
public void RegisterType_CheckIfContainerRegisterTypeIsCalled_Oance()
{
//Arrange
var injectorServiceModel = new InjectorServiceModel()
{
From = typeof(IInjectorContainerFake),
To = typeof(InjectorContainerFake)
};
bool wasCalled = false;
_unitContaineMock.Setup(x => x.RegisterType(It.IsAny<Type>(), It.IsAny<Type>())).Callback(() =>
{
wasCalled = true;
});
//Act
_injectorContainer.RegisterType(injectorServiceModel);
//Assert
Assert.IsTrue(wasCalled);
}
处于这种状态的代码实际上是我的第二个模式,我第一次尝试这样做:
[TestMethod]
public void RegisterType_CheckIfContainerRegisterTypeIsCalled_Oance()
{
//Arrange
var injectorServiceModel = new InjectorServiceModel()
{
From = typeof(IInjectorContainerFake),
To = typeof(InjectorContainerFake)
};
//Act
_injectorContainer.RegisterType(injectorServiceModel);
//Assert
_unitContaineMock.Verify(x => x.RegisterType(It.IsAny<Type>(), It.IsAny<Type>()), Times.Once);
}
在这两种情况下,我都会收到一个系统未支持异常,其中包含以下消息:
从对非虚拟(可在 VB 中覆盖)成员的无效验证:x => x.RegisterType(It.IsAny(), It.IsAny(), new[] { })
我从中可以理解的情况来看,当它试图验证时,它似乎正在寻找具有 3 个参数的 RegisterType。
有谁知道我在这里做错了什么?
我正在尝试测试是否已调用注册类型。
我 99% 确定您得到这个的原因是因为您调用的RegisterType
重载实际上是在其他地方定义的扩展方法,并且您不能在扩展方法上使用设置/验证(因为它们在技术上是静态的)。我基于此处IUnityContainer
的方法列表:http://msdn.microsoft.com/en-us/library/microsoft.practices.unity.iunitycontainer_members(v=pandp.30).aspx。接口上实际定义的唯一RegisterType
是这个,如您所见,它需要五个参数。
可能的解决方案:
- 请改用采用五个参数的重载。您将能够对此进行验证。但是,为了使您的代码更加复杂,以便能够编写单元测试,这当然是相当愚蠢的。
- 使用"真实"容器而不是模拟,而不是执行验证,而是在单元测试中调用 IsRegistered 重载之一,以检查类型是否已实际添加到容器中。无论如何,这可能是一种更可取的方法。它肯定会不那么脆。单元测试不应该真正关心使用哪个特定方法将类型添加到容器;它应该只验证是否已添加类型。