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()。
有人可以建议这样做的正确方法吗?
答案 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 存根的方法,但它本身并不是存根。更简单地说,您将ManagerDao
与ManagerDaoStub
混在一起。
假设您在上面进行了示例更改,则可以使断言像这样工作:
sinon.assert.calledWith(ManagerDao.prototype.initFindOpenCases, DEVICE_ID, KEY, null)
但是,这不是我建议更改的全部。后一种混淆的产生主要是因为您使测试的设置代码过于复杂。您无需制作整个类就可以存根ManagerDao的一种方法。
相反,只需将您的before
和after
呼叫替换为以下内容:
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。