【问题标题】:Unit Testing Stubbed Method单元测试存根方法
【发布时间】:2009-09-29 15:48:29
【问题描述】:

鉴于这个类:

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 方法中被实例化,我看不出它是怎么可能的。有什么建议吗?

【问题讨论】:

    标签: c# unit-testing rhino-mocks


    【解决方案1】:

    您需要一些方法来比较 LogAction。您可以在 LogAction 上实现 Equals(如果从程序逻辑的角度来看它是有意义的),或者实现一个比较器作为测试的一部分。在第一种情况下,您将创建与生产代码中相同的 LogAction。

    【讨论】:

      【解决方案2】:

      [免责声明我在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));
      }
      

      【讨论】:

      • 有趣。我目前正在为这个项目使用 Rhino-Mocks,我以后一定会研究 Typemock。
      【解决方案3】:

      我会使用模拟,比如 EasyMock,您可以在其中模拟 IOrderLogger,然后执行以下操作:

      IOrderLogger log = EasyMock.createMock(IOrderLogger.class);
      log.Action(EasyMock.isA(LogAction.class));
      EasyMock.expectLastCall();
      

      这假设 Action() 返回 void。这是一种非常Java-esque 的方式。我不确定EasyMock.net 已经走了多远。

      【讨论】:

        猜你喜欢
        • 2011-06-20
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多