【发布时间】:2018-11-09 12:35:10
【问题描述】:
我正在尝试使用 FakeItEasy(4.9.1 版)为一些遗留代码创建单元测试。我创建了两个单元测试,其中一个按预期工作,另一个非常相似,尽管经过大量试验和错误,但仍无法工作。
这是似乎无法测试的方法的摘录:
public class PosMessageProcessor : IPosMessageProcessor
{
public void Execute()
{
PurchaseOrderRepository repo = new PurchaseOrderRepository();
...
try
{
m_PurchaseOrder = GetOrderForProcessing(repo);
...
这是我的测试:
[TestMethod]
[TestCategory("POS")]
public void ExecuteTest()
{
// Arrange
PurchaseOrder purchaseOrder = GetPurchaseOrder();
IPosMessageProcessor fakePosMessageProcessor = A.Fake<IPosMessageProcessor>();
A.CallTo(() => fakePosMessageProcessor.GetOrderForProcessing(A<IPurchaseOrderRepository>.Ignored)).Returns(purchaseOrder);
// Act
_posMessageProcessor.Execute();
// Assert
A.CallTo(() => fakePosMessageProcessor.GetOrderForProcessing(A<IPurchaseOrderRepository>.Ignored)).MustHaveHappened();
}
_posMessageProcessor 变量是PosMessageProcessor 类的一个实例。我想捕捉对GetOrderForProcessing() 方法的调用(在Execute() 方法内)并让它返回我硬编码的purchaseOrder 对象。但是我得到了另一个返回值(null)。为什么?
有效的单元测试测试GetOrderForProcessing() 方法:
[TestMethod]
[TestCategory("POS")]
public void GetOrderForProcessingTest()
{
// Arrange
PurchaseOrder purchaseOrder = GetPurchaseOrder();
IPurchaseOrderRepository fakePurchaseOrderRepository = A.Fake<IPurchaseOrderRepository>();
A.CallTo(() => fakePurchaseOrderRepository.GetPurchaseOrderByOrderTrackingNumber(A<string>.Ignored)).Returns(purchaseOrder);
// Act
PurchaseOrder result = _posMessageProcessor.GetOrderForProcessing(fakePurchaseOrderRepository);
// Assert
A.CallTo(() => fakePurchaseOrderRepository.GetPurchaseOrderByOrderTrackingNumber(A<string>.Ignored)).MustHaveHappened();
Assert.IsNotNull(result);
}
在这种情况下,对GetPurchaseOrderByOrderTrackingNumber() 的调用会按预期返回我的硬编码对象。这两个测试几乎相同,只是GetOrderForProcessing() 方法带有一个参数,而Execute() 没有。
【问题讨论】:
标签: c# fakeiteasy