1

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

[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 中注册。

4

1 回答 1

2

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

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

于 2013-11-12T03:21:45.750 回答