奇怪的javascript范围问题

奇怪的javascript范围问题,javascript,scope,sinon,Javascript,Scope,Sinon,我面临着(对我来说)奇怪的javascript范围问题,如下所述。感谢你的指点 测试“成功手动提交卡夫卡”成功 对于(mqClient.commit.called).to.be.true断言,测试“手动提交到Kafka失败”失败,并显示消息“预期false为true” describe('samplelistener tests', () => { let sandbox const mqClient = { on: sinon.spy(), send: sinon.spy(),

我面临着(对我来说)奇怪的javascript范围问题,如下所述。感谢你的指点

测试“成功手动提交卡夫卡”成功
对于(mqClient.commit.called).to.be.true断言,测试“手动提交到Kafka失败”失败,并显示消息“预期false为true”

describe('samplelistener tests', () => {
  let sandbox
  const mqClient = { on: sinon.spy(), send: sinon.spy(), commit: sinon.stub() }

  it('successful manual commit to Kafka', () => {
    samplelistener.start(mqClient, {}, log)
    const handler = mqClient.on.getCall(0).args[1] // get the message event handler
    // call the samplelistener handler
    handler('randomtopicname', exampleMessage)
    expect(mqClient.commit.called).to.be.true // eslint-disable-line
  })
  it('failed manual commit to Kafka', () => {
    mqClient.commit = sinon.stub().throws()
    samplelistener.start(mqClient, {}, log)
    const handler = mqClient.on.getCall(0).args[1] // get the message event handler
    // call the samplelistener handler
    handler('randomtopicname', exampleMessage)
    expect(mqClient.commit.called).to.be.true // eslint-disable-line
  })
  it('failed manual commit to Kafka check 2', () => {
    mqClient.commit = sinon.stub().throws()
    samplelistener.start(mqClient, {}, log)
    const handler = mqClient.on.getCall(0).args[1] // get the message event handler
    // call the samplelistener handler
    handler('randomtopicname', exampleMessage)
    expect(mqClient.commit).to.throw(Error) // eslint-disable-line
  })

}

//sampleListener.js
const start = (mqClient, sampleConfig, log) => {
  mqClient.on('message', (topic, message) => {
        mqClient.commit()
    }
}

为什么你确定它与范围有关?我宁愿说它与你的存根有关。如果它
thows
,那么它会被调用吗?我希望你能确认它确实抛出了一个错误,而不仅仅是检查它是否被调用。是的,我不相信你真的调用了回调。或者您确实这样做了,但是即使调用了
commit
,即使它抛出了一个错误,这也算是调用了
commit。但我可能错了。我添加了
sinon
标记,因为我对库不太了解,不知道它在这种情况下应该做什么。谢谢您的评论。我想这是因为sinon的工作方式,我尝试了失败测试用例2,它成功了。