如果解构存根方法,sinon存根将无法正确恢复

时间:2018-09-28 15:55:49

标签: javascript node.js mocha sinon

给出以下测试代码:

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不起作用,但是如果我使用对象进行调用,它将起作用吗?其背后的机制是什么?

0 个答案:

没有答案