2013-08-02 288 views
0

我有一个4层应用程序我应该在n层应用程序

1)表示(MVC)
2)服务(WCF)
3)商业
4)数据

测试哪些层

在我的服务层的一些方法进行了大量的如其他子进程,

public OrderResponse PlaceOrder(OrderRequest request) 
{ 
    if (CheckForSufficientStock(request.ItemId)) { 
      ReserveStock(request.ItemId); 
      ProcessPayment(request.CustomerPaymentDetails); 
      RemoveStockFromInventory(request.ItemId); 
      ArrangeForShipping(request.CustomerDetails); 
      AddToOrderHistory(request);   
    } 
} 

我开始学习如何编写单元测试,并且我有几个问题

1)我应该为单元测试编写哪一层?我是否在MVC项目中为我的控制器编写单元测试?还是必须为我的服务层中的每个方法编写单元测试?或两者? 2)如果我必须为MVC &服务层编写单元测试,我是否可以说,我的MVC项目中的单元测试将测试PlaceOrder,并且单元测试测试我的服务层将测试所有的子功能,例如ReserveStock,ProcessPayment等?

回答

2

通常您需要端到端测试以及单元测试。我不想解释这个基本概念,但我只想从我自己的经验中列出一些最佳实践。

为了进行单元测试,一次只能测试一层嘲讽它基于的图层。例如,当您测试业务层时,您应该模拟数据访问层。通过嘲笑下面的图层,您可以在逻辑上隔离要测试的代码存根,而无需触及其他图层。这种方法不仅容易处理,还可以防止测试太多东西并获得虚假警报。您也可以准备测试夹具以确保您每次运行测试时,都会执行dry run

下面是一些流行的技术,你可以用做单元测试:

  • 在视图层测试javascipt的,你可以使用茉莉花
  • 要测试的C#代码,你可以使用MSTest的NUnit的的xUnit
  • 嘲笑C#层,可以使用起订量
  • 要做到端到端的测试,你可以使用
+1

另外考虑看看[NFluent](https://github.com/tpierrain/NFluent)一个非常强大的符合人体工程学的断言库[AutoFixture](https://github.com/AutoFixture),它可以帮助你如果你想要进行自动化测试,你可以尽量减少单元测试的'安排'阶段和[SpecFlow](http://www.specflow.org/)! – MaxSC

0

我们都知道,单元测试是指在同一时间测试单个方案。 你将不得不为所有图层编写单元测试。 例如,在你的情况下,在MVC PlaceOrder方法中,你的测试用例可以是:是否CheckForSufficientStock输入参数不为空,或者Verify,每个函数的调用方式为TimesOnce。 同样,在其他层,说

CheckForSufficientStock(int something) 
{ 
... 
} 

同样的事情也会接踵而至,如果任何函数被再次调用,然后验证时间,返回值。 Mocking需要跳到其它的层或功能实际呼叫,通过与返回的值,这是进行到下一行代码所需的东西作假。我发现Moq最适合初学者使用。

相关问题