你需要为所有依赖提供测试替身,不一定是模拟对象。
幸运的是,现在已经是21世纪了,有工具可以帮助我们更轻松地完成这项工作。你可以使用AutoFixture创建一个OrderController
实例并根据需要注入模拟对象。
var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization());
var orderController = fixture.Create<OrderController>();
基本上等同于以下内容:
var factory = new Mock<IViewModelFactory>();
var repository = new Mock<INewsRepository>();
var delegateHelper = new Mock<IDelegateHelper >();
var customerContext = new Mock<ICustomerContextWrapper >();
var orderController = new OrderController(factory.Object, repository.Object, delegateHelper.Object, customerContext.Object);
如果这些依赖项依赖于其他类型,那么它们也将被设置。使用
AutoConfiguredMoqCustomization
自定义的AutoFixture将构建整个依赖关系图。
如果您需要访问存储库模拟,以便稍后可以对其进行一些额外的设置或断言,则可以
冻结它。冻结类型将使
fixture
容器仅包含该类型的一个实例,例如:
var fixture = new Fixture().Customize(new AutoConfiguredMoqCustomization());
var repositoryMock = fixture.Freeze<Mock<INewsRepository>>();
repositoryMock.Setup(x => x.Retrieve()).Returns(1);
var orderController = fixture.Create<OrderController>();
repositoryMock.Verify(x => x.Retrieve(), Times.Once);
我在这些示例中使用了Moq,但是AutoFixture也可以与NSubstitute、RhinoMock和Foq集成。
声明:我是该项目的贡献者之一。