给出以下测试代码:
subAuthCall:
const sinon = require('sinon')
const sandbox = sinon.createSandbox()
function stubSuccessCall() {
return sandbox.stub(authorization, 'authorize').returns({enabled: true});
}
function stubFailedCall() {
return sandbox.stub(authorization, 'authorize').returns({enabled: false});
function restoreSub() {
sandbox.restore();
}
在authorization.js文件中,我有:
function authorize(data) {
return data.enabled;
}
module.exports = {
authorize
}
然后在中间件中,我有:
const {authorize} = require('./authorization')
async function check() {
//import auth data
console.log(authorize(data))
if (authorize(data)) {
//resolve to true
} else {
//reject
}
}
然后在测试案例中,我打电话给
afterEach(authorizationStub.restorStub);
describe('auth testing', () => {
it('test successful', () => {
authorizationStub.stubSuccessCall();
return check().then(res => {expect(res.result).to.equl(true)});
})
it('test failed', () => {
authorizationStub.stubFailedCall();
return check().then(res => {expect(res.result).to.equl(false)});
})
})
这是一个过于简化的身份验证逻辑和测试用例。我遇到的怪异问题是,如果我同时运行两个测试用例,则会打印出:
1-测试成功
true //来自console.log(authorize(data))
2-测试失败
true //来自console.log(authorize(data))
第一个测试用例通过了,第二个测试用例失败了(因为存根没有返回正确的结果)
但是在测试失败的情况下,它应该返回false,就像我在stubFailedCall中存根的方式一样,但是在stubSuccessCall中它仍然具有相同的结果。我已经验证了restoreStub被称为。
我不小心遇到了此修复程序:在中间件中,我曾经遇到过:
const {authorize} = require('./authorization')
...
但是如果我将其更改为:
const auth = require('./authorization')
,然后在代码中,而不是:
authorize(data)
我这样做:
auth.authorize(data)
这将起作用-两个测试用例都将通过且没有任何其他更改。
我的问题是,如果我在中间件中解构authorize调用,为什么sinon stub / restore stub不起作用,但是如果我使用对象进行调用,它将起作用吗?其背后的机制是什么?