这个单元测试类是专门用来测试刚才那个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);
}
}
}