使用sinon声明存根方法的参数

时间:2018-12-04 13:17:58

标签: node.js sinon stubbing sinon-chai

d.huge <- read.csv("d.huge.csv")
d.huge.1 <- d.huge[sample(nrow(d.huge), 3/4*nrow(d.huge)), ]
d1 <- seqRank3(d.huge.1, 1.27e-1, 1.780e1)
d2 <- d1[complete.cases(d1), ]
dim(d2)
names(d2)

这是写在节点import ManagerDaoStub from '../salesforce/__test__/ManagerDaoStub'; import criticalMerchants from '../criticalMerchants'; describe('criticalMerchants Unit Tests', () => { before(() => { ManagerDaoStub.initStubs(); }); after(() => { ManagerDaoStub.restoreStubs(); }); it('assert the arguments of stubbed method', (done)=>{ let load = criticalMerchants.createCases(MERCHANT, DEVICE_ID, KEY, {}); return done(); }); }) 中的测试文件。我要测试的方法是criticalMerchants.test.js,使用的是createCases中的方法,该方法已在ManagerDao中存根,如下所示。

ManagerDaoStub

我想断言是否使用正确的参数(DEVICE_ID,KEY,null)调用了此存根方法import ManagerDao from '../ManagerDao'; class ManagerDaoStub { constructor() { this.sandbox = sinon.sandbox.create(); } initStubs(sandbox) { this.sandbox = sandbox || this.sandbox; this.restoreStubs(); this.initFindOpenCases(); } restoreStubs() { this.sandbox.restore(); } initFindOpenCases() { let findOpenCases = this.sandbox.stub(ManagerDao, "findOpenCases"); findOpenCases .withArgs(DEVICE_ID, KEY, match.func) .callsArgWith(2, new Error("Test error")); } } 。我用了 initFindOpenCases,这将产生以下错误:

  

AssertError:未初始化initFindOpenCases()。

有人可以建议这样做的正确方法吗?

1 个答案:

答案 0 :(得分:0)

首先,如果ManagerDao.initFindOpenCases是实例方法(我不确定,因为您尚未共享其定义),那么您就不能像在此处所做的那样在构造函数上添加它:

let findOpenCases = this.sandbox.stub(ManagerDao, "findOpenCases")

您需要先创建一个实例-然后在该实例上存根-或像这样在原型本身上存根:

let findOpenCases = this.sandbox.stub(ManagerDao.prototype, "findOpenCases"); 

其次,您在断言中再次犯了相同的错误,并加上另一个错误:

sinon.assert.calledWith(ManagerDaoStub.initFindOpenCases, DEVICE_ID, KEY, null)

ManagerDaoStub是构造函数,它没有 一个initFindOpenCases属性。它的 prototype 也是如此,因此它的 instances 也是如此。最重要的是,ManagerDaoStub.prototype.initFindOpenCases仍然是 still 而不是存根。这是您要调用 create 存根的方法,但它本身并不是存根。更简单地说,您将ManagerDaoManagerDaoStub混在一起。

假设您在上面进行了示例更改,则可以使断言像这样工作:

sinon.assert.calledWith(ManagerDao.prototype.initFindOpenCases, DEVICE_ID, KEY, null)

但是,这不是我建议更改的全部。后一种混淆的产生主要是因为您使测试的设置代码过于复杂。您无需制作整个类就可以存根ManagerDao的一种方法。

相反,只需将您的beforeafter呼叫替换为以下内容:

beforeEach(() => {
    // Create the stub on the prototype.
    sinon.stub(ManagerDao.prototype, 'findOpenCases')
        .withArgs(DEVICE_ID, KEY, sinon.match.func)
        .callsArgWith(2, newError('Test Error'));
});
afterEach(() => {
    // As of sinon 5.0.0, the sinon object *is* a sandbox, so you can
    // easily restore every fake you've made like so:
    sinon.restore();
});

除此之外,我建议深入研究构造函数的属性与其原型的属性之间的区别。这些知识将使您更轻松地进行此类操作。最好的起点可能是here on MDN