为什么在实例已被模拟时向Unity注册

时间:2013-11-12 03:17:30

标签: unity-container moq

我刚刚从现有应用程序中看到了一些现有代码,我试图了解单元测试中的前两行。这是单元测试:

[TestMethod]
    public void CanDisplayReportWithPage()
    {
        var claimComponent = new Mock<IClaimsComponent>();
        GlobalContainer.Unity.RegisterInstance(claimComponent.Object);

        _pharmacyCdmService
            .Setup(service => service.ReadAllTenantEstablishments((It.IsAny<Guid>())))
            .Returns(ResponseHelper.CreateResponse(new TenantEstablishmentDataContract[0]));

        _pharmacyCdmService
            .Setup(service => service.ReadTenantById((It.IsAny<long>())))
            .Returns(ResponseHelper.CreateResponse(new TenantDataContract()));

        claimComponent.Setup(
            component => component.FileDetailsClaimReport(It.IsAny<RamqDetailsClaimReportRequestDataContract>()))
            .Returns(new RamqDetailsClaimReportResponseDataContract());

        var result = (ViewResult)_controller.View(new DetailsReportModel(), 3);

        _pharmacyCdmService.VerifyAll();
        _claimIdentityHelper.VerifyAll();

        Assert.IsNotNull(result);
        Assert.IsNotNull(result.Model);
        Assert.AreEqual("Index", result.ViewName);
        Assert.IsInstanceOfType(result.Model, typeof(DetailsReportModel));
        Assert.AreEqual(2, ((DetailsReportModel) result.Model).DataContract.PageTransaction);
    }

此测试使用Moq和Unity的组合。我想要了解的是为什么被模拟的实例(claimComponent)必须在Unity中注册。

1 个答案:

答案 0 :(得分:2)

我的猜测是被测系统使用Service Locator anti-pattern。 GlobalContainer是关键 - 它可能是Singleton(通常是另一种反模式),使IoC容器随处可用。

更好的替代方法是使用Unity.MVC3或等效的构造函数注入(可能使用控制器)。这可以让你在一个Composition Root中组成所有内容。您的单元测试通常根本不需要引用Unity;他们可以创建一个模拟并将其传递给控制器​​。