【问题标题】:Creating a fake object.method() "from scratch" in sinon?在 sinon 中“从头开始”创建一个假的 object.method()?
【发布时间】:2015-05-12 18:03:50
【问题描述】:

tl;博士

如何在 sinon 中“从头开始”创建 object.method()?

上下文

例如,我有一系列Parser 类,其中每个类都实现#parse(text) 方法并返回ParseTree 对象或返回null

我正在进行单元测试,而我测试Parser 对象本身(它们在其他地方进行了测试),但我需要一个响应#parse() 的可测试对象。我可以实例化并存根一个真正的 Parser,但这会将不必要的代码拖入测试的这一部分。

问题

我很确定这很容易使用 sinon 的 spy()、stub() 和/或 mock() api,所以:我如何创建一个可测试的对象:

  • 响应 parse() 方法
  • 验证它是否被调用过一次
  • 返回我指定的任意对象?

我尝试过的

以下人为设计的示例在调用 sinon.stub() 时失败,因为无法使用 parse 方法存根 sinon.spy() 对象。 (这个例子还应该验证fake_parser.parse()test_text 调用过一次,但它没有):

var test_text = 'any text'
var fake_parse_tree = sinon.spy()
var fake_parser = sinon.stub(sinon.spy(), 'parse').returns(fake_parse_tree)

expect(fake_parser.parse(test_text)).to.equal(fake_parse_tree)

【问题讨论】:

    标签: javascript node.js mocha.js sinon chai


    【解决方案1】:

    创建一个虚拟的Parser 对象并存根它的parse() 方法。详细信息将取决于您创建解析器的方式,但类似于:

    var Parser = {
        parse: function() { }
    };
    
    var parseStub = sinon.stub(Parser, 'parse');
    parseStub.returns(fake_parse_tree);
    
    // execute code that invokes the parser
    
    parseStub.callCount.should.equal(1);
    parseStub.alwaysCalledWithExactly(test_text).should.be.true();
    

    【讨论】:

    • 啊!一个关键点是sinon.stub(obj, method) 返回的是存根的 METHOD,而不是对象。我很困惑,因为我试图将 parseStub 传递给我的代码,它需要一个解析器。谢谢!
    【解决方案2】:

    @斯蒂芬·托马斯gave the right answer here。为了将来参考,这就是我最终所做的。 'aha' 是 sinon.stub(object, 'method') 返回存根的方法,而不是对象。

    因为这是 javascript(并且方法是一等对象),所以返回方法非常有意义:

    var test_text = 'any text';
    var parse_tree = sinon.spy(); // could be any object
    var proxy_parser = { parseText: function() { } };
    var stubbed_method = sinon.stub(proxy_parser, 'parseText').returns(parse_tree)
    
    // App specific tests not shown here:
    // ...pass proxy_parser to a function that calls proxy_parser.parseText()
    // ...verify that the function returned the parse_tree
    
    expect(stubbed_method.callCount).to.equal(1)
    expect(stubbed_method.alwaysCalledWithExactly(test_text)).to.be.true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2021-04-12
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多