这个单元测试类是专门用来测试刚才那个OrderService的,里面包括两个GetOrders方法的测试用例;可以一目了然的看见,这两个测试用例代码中都包含了对测试类的构造函数的参数接口Mock代码;
图1:
像这种简单的情况下,我们只需要将公共的部分拿出来放到测试的类中声明,就可以公用这块对象;
图2:
这样可以解决内部重复问题,但是这里需要小心的地方是,当我们在不同的用例之间共享部分Mock逻辑的时候可能会出现问题;比如我们在OrderService_GetOrders_NormalFlows用例中,对IServiceConnection接口进行了部分行为的Mock但是当执行到OrderService_GetOrders_OrderIdIsNull用例时可能是用的我们上一次的Mock逻辑;所以这里需要注意一下,当然如果设计合理的话是不太可能会出现这种问题的;单一职责原则只要满足我们的接口是不会包含其他的逻辑在里面,也不会出现在不同的用例之间共存相同的接口逻辑;同时也满足接口隔离原则,就会更加对单元测试有利;
我们接着看一下第二个过程,看一下测试示例代码:
namespace UnitTestRefactoring { public class ProductService { private IServiceConnection ServiceConnection; private IServiceReader ServiceReader; private IServiceWriter ServiceWrite; public ProductService(IServiceConnection connection, IServiceReader reader, IServiceWriter writer) { this.ServiceConnection = connection; this.ServiceReader = reader; this.ServiceWrite = writer; } public bool GetProduct(string productId) { if (string.IsNullOrWhiteSpace(productId)) return false; return true; } } } |
namespace UnitTestRefactoring { public class ProductService { private IServiceConnection ServiceConnection; private IServiceReader ServiceReader; private IServiceWriter ServiceWrite; public ProductService(IServiceConnection connection, IServiceReader reader, IServiceWriter writer) { this.ServiceConnection = connection; this.ServiceReader = reader; this.ServiceWrite = writer; } public bool GetProduct(string productId) { if (string.IsNullOrWhiteSpace(productId)) return false; return true; } } } |
这个是表示Product服务,构造函数中同样和之前的OrderService一样的参数列表,然后就是一个简单的GetProduct方法;
using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using NSubstitute; using UnitTestRefactoring; namespace UnitTestRefactoring.UnitTests { [TestClass] public class ProductService_UnitTests { IServiceConnection mockServiceConnection = Substitute.For<IServiceConnection>(); IServiceReader mockServiceReader = Substitute.For<IServiceReader>(); IServiceWriter mockServiceWriter = Substitute.For<IServiceWriter>(); [TestMethod] public void ProductService_GetProduct_NormalFlows() { ProductService testProductService = new ProductService(mockServiceConnection, mockServiceReader, mockServiceWriter); bool testResult = testProductService.GetProduct("5475684684"); Assert.AreEqual(true, testResult); } [TestMethod] public void ProductService_GetProduct_ProductIsNull() { ProductService testProductService = new ProductService(mockServiceConnection, mockServiceReader, mockServiceWriter); bool testResult = testProductService.GetProduct(string.Empty); Assert.AreEqual(false, testResult); } } } |
using System; |