我有一个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等?
答案 0 :(得分:3)
通常,您需要端到端测试以及单元测试。我不想解释基本概念,但我只想根据自己的经验列出一些最佳实践。
进行单元测试时,只能通过模拟基于它的图层一次测试一个图层。例如,在测试业务层时,应该模拟数据访问层。通过模拟下面的图层,您可以在逻辑上隔离要测试的代码存根,而无需触及其他图层。这种方法不仅易于使用,而且还可以防止测试太多东西并获得错误警报。您还可以准备测试夹具以确保每次运行测试时,实际上都是dry run
。
以下是一些可用于进行单元测试的流行技术:
答案 1 :(得分:0)
我们都知道,单元测试意味着一次测试单个场景。
您必须为所有图层编写单元测试。
例如,在您的情况下,在MVC PlaceOrder
方法中,您的测试用例可以是:CheckForSufficientStock
输入参数是否为空,或Verify
每个函数都被称为TimesOnce
。
同样,在其他层中,Say
CheckForSufficientStock(int something)
{
...
}
如果再次调用任何函数,则会跟随相同的事情,然后验证Times,返回值。
Mocking
需要通过伪造返回值来跳过对其他图层或函数的实际调用,这是进入下一行代码所必需的。我发现Moq
最适合初学者使用。