.NET重构—单元测试重构(1)

发表于:2013-10-09 11:11

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wangqingpei557    来源:51Testing软件测试网采编

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

43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号