我应该在n层应用程序中测试哪一层

时间:2013-08-02 02:21:54

标签: c# asp.net-mvc unit-testing n-tier-architecture

我有一个4层申请

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和amp;服务层,我说得对,我的MVC项目中的单元测试将测试PlaceOrder,测试我的服务层的单元测试将测试所有子功能,例如ReserveStock,ProcessPayment等?

2 个答案:

答案 0 :(得分:3)

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

进行单元测试时,只能通过模拟基于它的图层一次测试一个图层。例如,在测试业务层时,应该模拟数据访问层。通过模拟下面的图层,您可以在逻辑上隔离要测试的代码存根,而无需触及其他图层。这种方法不仅易于使用,而且还可以防止测试太多东西并获得错误警报。您还可以准备测试夹具以确保每次运行测试时,实际上都是dry run

以下是一些可用于进行单元测试的流行技术:

  • 要在View Layer中测试Javascipt,您可以使用 Jasmine
  • 要测试C#代码,您可以使用 MSTest nUnit xUnit
  • 要模拟C#图层,您可以使用 Moq
  • 要进行端到端测试,您可以使用 Selenium

答案 1 :(得分:0)

我们都知道,单元测试意味着一次测试单个场景。 您必须为所有图层编写单元测试。 例如,在您的情况下,在MVC PlaceOrder方法中,您的测试用例可以是:CheckForSufficientStock输入参数是否为空,或Verify每个函数都被称为TimesOnce。 同样,在其他层中,Say

CheckForSufficientStock(int something)
{
...
}

如果再次调用任何函数,则会跟随相同的事情,然后验证Times,返回值。 Mocking需要通过伪造返回值来跳过对其他图层或函数的实际调用,这是进入下一行代码所必需的。我发现Moq最适合初学者使用。

相关问题