模拟 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。

有谁知道我在这里做错了什么?

我正在尝试测试是否已调用注册类型。

模拟 UnityContainer RegisterType 会导致系统不受支持异常

我 99% 确定您得到这个的原因是因为您调用的RegisterType重载实际上是在其他地方定义的扩展方法,并且您不能在扩展方法上使用设置/验证(因为它们在技术上是静态的)。我基于此处IUnityContainer的方法列表:http://msdn.microsoft.com/en-us/library/microsoft.practices.unity.iunitycontainer_members(v=pandp.30).aspx。接口上实际定义的唯一RegisterType是这个,如您所见,它需要五个参数。

可能的解决方案:

  1. 请改用采用五个参数的重载。您将能够对此进行验证。但是,为了使您的代码更加复杂,以便能够编写单元测试,这当然是相当愚蠢的。
  2. 使用"真实"容器而不是模拟,而不是执行验证,而是在单元测试中调用 IsRegistered 重载之一,以检查类型是否已实际添加到容器中。无论如何,这可能是一种更可取的方法。它肯定会不那么脆。单元测试不应该真正关心使用哪个特定方法将类型添加到容器;它应该只验证是否已添加类型。