【问题标题】:Sinon spy fails with bad arguments for one function but succeeds for another identical oneSinon spy 因一个函数的参数错误而失败,但另一个相同的函数却成功了
【发布时间】:2017-09-23 23:00:10
【问题描述】:

我对我看到的行为感到非常困惑。我的间谍一直误报这些论点。如果我创建具有相同签名和参数的相同函数并分别对其进行监视,则副本可以正常工作。我无法弄清楚发生了什么!

所以,这里是代码:

注意:alert 是原始函数,test 是我创建的新函数以检查发生了什么。

# index.js
class Alerter {

  getOnErrorFn(name) {
    return (error) => {
      ...
       alert = {
         opts: {
           tags: 'Unknown Error'
         }
       }
       ...

      if (alert) {
        this.test(name, error.message, Object.assign({}, alert.opts, {smc_error: error.toLog()}), alert.level);
        this.alert(name, error.message, Object.assign({}, alert.opts, {smc_error: error.toLog()}), alert.level);            }
    };
  }

  test(serviceName, message, opts={}, level=this.CRITICAL) {
    console.log(serviceName, message, opts, level);
  }

  alert(serviceName, message, opts={}, level=this.CRITICAL) {
    console.log(serviceName, message, opts, level);
    ...
  }

这是我的测试代码(所有其他测试都被注释掉了,这是测试套件中唯一的文件);

# alerter.spec.js
const sandbox = sinon.sandbox.create();

describe('Alerter', function(){

  let alerter;
  let name = 'test-service';
  let message = 'test message';

  beforeEach(() => {
    alerter = new Alerter(name);
  });

  afterEach(() => {
    sandbox.restore();
  });

  describe('getOnErrorFn()', () => {
    it.only('handles non-SMCError errors and assumes they should be alerted', () => {
      const spy = sandbox.spy(alerter, 'test');
      const spi = sandbox.spy(alerter, 'alert');
      const onError = alerter.getOnErrorFn(name);

      const error = new Error();
      const smcError = SMCError.from(error);
      onError(error);
      expect(spy).to.have.been.calledWith(name, smcError.message, {smc_error: smcError.toLog(), tags: 'Unknown Error'}, undefined);
      expect(spi).to.have.been.calledWith(name, smcError.message, {smc_error: smcError.toLog(), tags: 'Unknown Error'}, undefined);
    });

  });

});

这是测试运行的结果....这绝对是我的疯子!

$ npm test

> smc-alerting@2.1.3 test /Users/al/Studio/Projects/smc/app/smc-alerting
> mocha test/**/*.spec.js



  Alerter
    getOnErrorFn()
TEST test-service Caught Error { tags: 'Unknown Error',
  smc_error: 'Error Caught Error\n  caused by: Caught Error' } critical
ALERT test-service Caught Error { tags: 'Unknown Error',
  smc_error: 'Error Caught Error\n  caused by: Caught Error' } critical
      1) handles non-SMCError errors and assumes they should be alerted


  0 passing (34ms)
  1 failing

  1) Alerter getOnErrorFn() handles non-SMCError errors and assumes they should be alerted:
     expected alert to have been called with arguments test-service, Caught Error, {
  smc_error: "Error Caught Error
  caused by: Caught Error",
  tags: "Unknown Error"
}, undefined
    alert(test-service, Caught Error, { smc_error: "Error Caught Error
  caused by: Caught Error" }, undefined) at /Users/al/Studio/Projects/smc/app/smc-alerting/src/index.js:46:14
  AssertionError: expected alert to have been called with arguments test-service, Caught Error, {
    smc_error: "Error Caught Error
    caused by: Caught Error",
    tags: "Unknown Error"
  }, undefined
      alert(test-service, Caught Error, { smc_error: "Error Caught Error
    caused by: Caught Error" }, undefined) at src/index.js:46:14
      at Context.it.only (test/index.spec.js:173:32)



npm ERR! Test failed.  See above for more details.

因此,请注意,两个 console.log 语句都会打印相同结果。但是,alert 函数的 spy 失败,打印输出表明该函数是在第三个参数中缺少 tags 属性的情况下调用的。卧槽!

或者这里发生了什么我不知道的事情?

非常感谢所有帮助。提前致谢!

【问题讨论】:

    标签: node.js sinon spy


    【解决方案1】:

    达尼特。得到了答案。长话短说:使用不可变对象!

    alert() 在后面的代码中有一个 delete opts.tags 行,这当然在 sinon 开始检查时更改了原始对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 2017-03-23
      • 2017-07-19
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多