这是单元测试类,没有什么特别的,跟之前的OrderService一样的逻辑;是不是发现两个测试类都在公用一组相关的接口,这里就需要我们将他们提取出来放入基类中;
using NSubstitute; namespace UnitTestRefactoring.UnitTests { public abstract class ServiceBaseUnitTestClass { protected IServiceConnection mockServiceConnection = Substitute.For<IServiceConnection>(); protected IServiceReader mockServiceReader = Substitute.For<IServiceReader>(); protected IServiceWriter mockServiceWriter = Substitute.For<IServiceWriter>(); } } using NSubstitute; namespace UnitTestRefactoring.UnitTests { public abstract class ServiceBaseUnitTestClass { protected IServiceConnection mockServiceConnection = Substitute.For<IServiceConnection>(); protected IServiceReader mockServiceReader = Substitute.For<IServiceReader>(); protected IServiceWriter mockServiceWriter = Substitute.For<IServiceWriter>(); } } |
提取出来的测试基类;
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace UnitTestRefactoring.UnitTests { [TestClass] public class ProductService_UnitTests : ServiceBaseUnitTestClass { [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 Microsoft.VisualStudio.TestTools.UnitTesting; namespace UnitTestRefactoring.UnitTests { [TestClass] public class ProductService_UnitTests : ServiceBaseUnitTestClass { [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); } } } ProductService_UnitTests类; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace UnitTestRefactoring.UnitTests { [TestClass] public class OrderService_UnitTests : ServiceBaseUnitTestClass { [TestMethod] public void OrderService_GetOrders_NormalFlows() { OrderService testOrderService = new OrderService(mockServiceConnection, mockServiceReader, mockServiceWriter); bool testResult = testOrderService.GetOrders("10293884"); Assert.AreEqual(true, testResult); } [TestMethod] public void OrderService_GetOrders_OrderIdIsNull() { OrderService testOrderService = new OrderService(mockServiceConnection, mockServiceReader, mockServiceWriter); bool testResult = testOrderService.GetOrders(string.Empty); Assert.AreEqual(false, testResult); } } } |
using Microsoft.VisualStudio.TestTools.UnitTesting; |
提取出来的抽象基类能在后面的单元测试重构中帮很大忙,也是为了后面的面向特定领域的单元测试框架做要基础工作;由于不同的单元测试类具有不同的基类,这里需要我们自己的分析抽象,比如这里跟Service相关的,可能还有跟Order处理流程相关的,相同的一组接口也只能出现在相关的测试类中;
2.1.2】公用的Mock行为
前面2.1.1】小结,我们讲了Mock接口对象的重构,这一节我们将来分析一下关于Mock对象行为的重构;在上面的IServiceConnection中我们加入了一个Open方法,用来打开远程链接;
namespace UnitTestRefactoring { public interface IServiceConnection { bool Open(); } } namespace UnitTestRefactoring { public interface IServiceConnection { bool Open(); } } |