[英]Unit Testing Stubbed Method
鑒於此類:
public class OrderService
{
public OrderService(IOrderLogger log)
{
this.log = log;
}
private readonly IOrderLogger log;
public void PurgeOrder(Order order)
{
...
var action = new LogAction("foo","bar");
log.Action(action);
}
}
而這個測試:
[Fact]
public void PurgeOrder_should_log_action()
{
var order = new Order();
var logger = MockRepository.GenerateStub<IOrderLogger>();
var service = new OrderService(logger);
service.PurgeOrder(order);
logger.AssertWasCalled(x => x.Action(????));
}
顯然測試是錯誤的。 如何在這種情況下斷言OrderLogger.Action(...)? 如果LogAction在PurgeOrder方法中實例化,我看不出它是如何可能的。 有什么建議么?
您需要一些方法來比較LogActions。 您可以在LogAction上實現Equals(如果從程序邏輯的角度來看是有意義的話),或者將比較器作為測試的一部分來實現。 在第一種情況下,您將創建與生產代碼中相同的LogAction。
[免責聲明我在Typemock工作]
據我所知,唯一可以設置期望並驗證方法被調用的工具是Typemock Isolator。 您正在尋找的未來被稱為“未來對象”,它有助於設置行為並在被測試代碼中“將被創建”的對象上驗證它們:
[Fact]
public void PurgeOrder_should_log_action()
{
var order = new Order();
var logger = Isolate.Fake.Instance<IOrderLogger>();
var logAction = Isolate.Fake.Instance<LogAction>();
Isolate.Swap.NextInstance<LogAction>().With(logAction);
var service = new OrderService(logger);
service.PurgeOrder(order);
Isolate.Verify.WasCalledWithExactArguments(() => logger.Action(logAction));
}
我會使用類似EasyMock的模擬,你可以模擬IOrderLogger,然后執行以下操作:
IOrderLogger log = EasyMock.createMock(IOrderLogger.class);
log.Action(EasyMock.isA(LogAction.class));
EasyMock.expectLastCall();
這假設Action()返回void。 這是一種非常Java的方式。 我不確定EasyMock.net到底有多遠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.