簡體   English   中英

單元測試存根方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM