15

我正在监视的函数,接收对象作为参数。我需要断言该函数是使用对象的某些属性调用的。

例如:我的 SUT 有:

function kaboom() {

    fn({ 
        foo: 'foo', 
        bar: 'bar', 
        zap: function() { ... },
        dap: true
     });
}

在我的测试中我可以这样做:

fnStub = sinon.stub();
kaboom();
expect(fnStub).to.have.been.called;

并且有效(很高兴知道它fn已被调用)。现在我需要确保正确的对象已被传递到函数中。我只关心 foobar属性,即我必须为参数的特定属性设置匹配。如何?

upd: sinon.match() 似乎适用于简单的对象。让我们提高标准,好吗?

如果我想在zap断言中包含函数怎么办?我该如何做?

4

2 回答 2

29

假设您正在使用sinon-chai,您可以calledWithsinon.match一起使用来实现这一点

expect(fnStub).to.have.been.calledWith(sinon.match({
  foo: 'foo',
  bar: 'bar'
}));
于 2015-06-16T18:49:51.480 回答
2

要实现 called.with部分对象检查,还可以使用chai-spies-augment包(https://www.npmjs.com/package/chai-spies-augment):

用法(请注意导入后的.default):

const chaiSpies = require('chai-spies');
const chaiSpiesAugment = require('chai-spies-augment').default;

chai.use(chaiSpies);
chai.use(chaiSpiesAugment);

用法 :

const myStub = { myFunc: () => true };
const spy1 = chai.spy.on(myStub, 'myFunc');
myStub.myFunc({ a: 1, b: 2 });

expect(spy1).to.have.been.called.with.objectContaining({ a: 1 });
于 2019-11-19T18:01:28.650 回答