TDD,Mocking,依赖注入和DRY原则

2 tdd mocking

我有一个控制器类,它在ctor中运行多个参数,这些参数在运行时被注入.

例:

    public ProductController(IProductRepositort productRepository, 
IShippingService shippingService, IEmailProvider emailProvider)
    {
    ...
    }
Run Code Online (Sandbox Code Playgroud)

我发现测试方法变得越来越大.我正在设置如下方法:

[Test]
public void CanSendProduct()
{
    //Code to set up stub
                List<Product> products = new List<Product>();
                for (int i = 0; i < length; i++)
                {
                    products.Add(new Product()));
                }

                var mockProductRepository = new Mock<IProductRepository>();
                mockProductRepository.Setup(x => x.GetProducts()).Returns(products);

                //Code to set up stub
                ....
                ....   
                var mockShippingService = new Mock<IShippingService>();
                mockShippingService.Setup(x => x.GetShippers()).Returns(shippers);

                //Code to set up stub
                .....
                .....
                 var mockEmailProvider = new Mock<IEmailProvider>();
                mockEmailProvider.Setup(x => x.Send()).Returns(provider);

                //Execute Test
                ....
                ....

                //Assert
                ....
                ....
}
Run Code Online (Sandbox Code Playgroud)

显然,在此测试类的每个方法中重复模拟设置是不切实际的.

如何创建丰富的模拟对象,使我能够对我的测试进行行为验证,同时最大限度地减少设置痛苦?

有什么TDD最佳实践来解决这个问题?

谢谢

Ate*_*ral 6

如果您的测试框架支持将在每次测试之前和之后调用的setup/teardown函数,请在这些函数中创建并销毁一些"默认"模拟对象.您的测试可以简单地使用它们,对于默认模拟对象不适合您的特殊情况,您可以简单地忽略它们并在这些测试中创建本地模拟对象.