我刚刚从现有应用程序中看到了一些现有代码,我试图了解单元测试中的前两行。这是单元测试:
[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中注册。
答案 0 :(得分:2)
我的猜测是被测系统使用Service Locator anti-pattern。 GlobalContainer是关键 - 它可能是Singleton(通常是另一种反模式),使IoC容器随处可用。
更好的替代方法是使用Unity.MVC3或等效的构造函数注入(可能使用控制器)。这可以让你在一个Composition Root中组成所有内容。您的单元测试通常根本不需要引用Unity;他们可以创建一个模拟并将其传递给控制器。