C# 模拟UnityContainer注册表类型会导致系统不支持异常

C# 模拟UnityContainer注册表类型会导致系统不支持异常,c#,unit-testing,unity-container,moq,mstest,C#,Unit Testing,Unity Container,Moq,Mstest,您好,我很难模拟IUnityContainer,特别是我正在尝试查看是否调用了寄存器类型。这是我尝试测试的方法: private readonly IUnityContainer _container; public InjectorContainer(IUnityContainer container) { _container = container; } public void RegisterType(InjectorServi

您好,我很难模拟IUnityContainer,特别是我正在尝试查看是否调用了寄存器类型。这是我尝试测试的方法:

    private readonly IUnityContainer _container;

    public InjectorContainer(IUnityContainer container)
    {
        _container = container;
    }

    public void RegisterType(InjectorServiceModel dependencyService)
    {
        _container.RegisterType(dependencyService.From, dependencyService.To);
    }
这是我的统一测试课:

 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);
    }
private Mock\u unitContaineMock;
私人注射剂容器\u注射剂容器;
[测试初始化]
公共无效初始值设定项()
{
_unitContaineMock=new Mock();
_injectorContainer=新的injectorContainer(\u unitContaineMock.Object);
}
[测试方法]
公共无效注册表类型\u CheckIfContainerRegisterTypeIsCalled\u Oance()
{
//安排
var injectorServiceModel=新injectorServiceModel()
{
From=类型(IInjectorContainerFake),
To=类型(InjectorContainerFake)
};
布尔被称为=假;
_unitContaineMock.Setup(x=>x.RegisterType(It.IsAny(),It.IsAny())。回调(()=>
{
wascall=true;
});
//表演
_injectorContainer.RegisterType(injectorServiceModel);
//断言
Assert.IsTrue(被称为Assert.IsTrue);
}
这种状态下的代码实际上是我的第二次尝试,我第一次尝试这样做:

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

    }
[TestMethod]
公共无效注册表类型\u CheckIfContainerRegisterTypeIsCalled\u Oance()
{
//安排
var injectorServiceModel=新injectorServiceModel()
{
From=类型(IInjectorContainerFake),
To=类型(InjectorContainerFake)
};
//表演
_injectorContainer.RegisterType(injectorServiceModel);
//断言
_验证(x=>x.RegisterType(It.IsAny(),It.IsAny()),Times.Once);
}
在这两种情况下,我都会得到一个SystemNotSupported异常,该异常包含以下消息:

对非虚拟(在VB中可重写)成员的验证无效:x=> x、 RegisterType(It.IsAny(),It.IsAny(),new[]{})

从这里我能理解的是,当它试图寻找一个带有3个参数的RegisterType时,它似乎在寻找一个RegisterType

有人知道我做错了什么吗


我正在尝试测试是否调用了RegisterType。

我99%确定您之所以会得到这种结果,是因为您正在调用的
RegisterType
重载实际上是在别处定义的扩展方法,并且您不能对扩展方法使用Setup/Verify(因为它们在技术上是静态的)。我是基于
IUnityContainer
的方法列表的。界面上实际定义的唯一的
RegisterType
,如您所见,它包含五个参数

可能的解决办法:

  • 改为使用接受五个参数的重载。你可以对那个进行验证。但是,仅仅为了编写单元测试而使代码更复杂,这当然是相当愚蠢的
  • 使用“真实”容器而不是模拟容器,并且不进行验证,而是调用单元测试中的一个重载来检查类型是否已实际添加到容器中。无论如何,这可能是一个更好的方法。它肯定不会那么脆。您的单元测试不应该真正关心将类型添加到容器中所使用的特定方法;它应该只是验证是否已经添加了类型