我有测试表明:
当在VS代码中一起运行
下面的代码是我所能做的最基本的代码(而且它非常粗糙):
const AWS = require("aws-sdk")
const SQS = new AWS.SQS()
exports.handler = () => {
return SQS.deleteMessage({foo: "bar"}).promise()
}而测试:
const sinon = require("sinon")
const expect = require("chai").expect
const AWS = require("aws-sdk")
describe("Bogus Test", () => {
let sandbox, deleteMessageStub
beforeEach(() => {
sandbox = sinon.createSandbox()
deleteMessageStub = sandbox.fake.returns({ promise: () => Promise.resolve({}) })
sandbox.stub(AWS, 'SQS').returns({
deleteMessage: deleteMessageStub
})
})
afterEach(() => { sandbox.restore() })
it("is the first test", () => {
const bogus = require("../bogus")
return bogus.handler().then(() => {
expect(deleteMessageStub.callCount).to.equal(1, 'Should have called deleteMessage once')
})
})
it("is the second test", () => {
const bogus = require("../bogus")
return bogus.handler().then(() => {
expect(deleteMessageStub.callCount).to.equal(1, 'Should have called deleteMessage once')
})
})
})结果:
Bogus Test
✓ is the first test
1) is the second test
1 passing (14ms)
1 failing
1) Bogus Test
is the second test:
Should have called deleteMessage once
+ expected - actual
-0
+1
at ... bogus.test.js:29:46我很高兴知道我在做些蠢事.
发布于 2021-03-22 02:37:02
require模块多次,模块作用域的代码将只执行一次,因为模块被缓存在require.cache对象中。
这意味着./bogus模块只加载一次,并在第二个require期间从require.cache对象获得。const SQS = new AWS.SQS();语句只执行一次。
您通过sinon.restore()清除了存根的调用信息,因此第二个测试用例的stub.callCount是0。
解决方案:清除 beforeEach() hook中的模块缓存
例如。
bogus.js
const AWS = require('aws-sdk');
const SQS = new AWS.SQS();
exports.handler = () => {
return SQS.deleteMessage({ foo: 'bar' }).promise();
};bogus.test.js
const sinon = require('sinon');
const expect = require('chai').expect;
const AWS = require('aws-sdk');
describe('Bogus Test', () => {
let sandbox, deleteMessageStub;
beforeEach(() => {
sandbox = sinon.createSandbox();
deleteMessageStub = sandbox.fake.returns({ promise: () => Promise.resolve({}) });
sandbox.stub(AWS, 'SQS').returns({
deleteMessage: deleteMessageStub,
});
delete require.cache[require.resolve('./bogus')];
});
afterEach(() => {
sandbox.restore();
});
it('is the first test', () => {
const bogus = require('./bogus');
return bogus.handler().then(() => {
expect(deleteMessageStub.callCount).to.equal(1, 'Should have called deleteMessage once');
});
});
it('is the second test', () => {
const bogus = require('./bogus');
return bogus.handler().then(() => {
expect(deleteMessageStub.callCount).to.equal(1, 'Should have called deleteMessage once');
});
});
});单元测试结果:
Bogus Test
✓ is the first test
✓ is the second test
2 passing (9ms)https://stackoverflow.com/questions/66715598
复制相似问题