1

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

4

2 回答 2

4

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

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

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

  • 要在视图层中测试 Javascipt,您可以使用Jasmine
  • 要测试 C# 代码,您可以使用MSTestnUnitxUnit
  • 要模拟 C# 层,您可以使用Moq
  • 要进行端到端测试,您可以使用Selenium
于 2013-08-02T02:49:33.737 回答
0

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

CheckForSufficientStock(int something)
{
...
}

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

于 2013-08-14T18:04:31.210 回答