Sinon 如何对异步函数进行单元测试的存根方法
Sinon how to stub method for unit testing a Async function
我正在尝试使用 mocha 和 sinon.js
为异步函数编写单元测试
下面是我的测试用例
describe('getOperations', function () {
let customObj, store, someObj
beforeEach(function () {
someObj = {
id: '-2462813529277062688'
}
store = {
peekRecord: sandbox.stub().returns(someObj)
}
})
it('should be contain obj and its ID', function () {
const obj = getOperations(customObj, store)
expect(obj).to.eql(someObj)
})
})
下面是我正在测试的异步函数的定义。
async function getOperations (customObj, store) {
const obj = foo(topLevelcustomObj, store)
return obj
}
function foo (topLevelcustomObj, store) {
return store.peekRecord('obj', 12345)
}
测试用例失败,因为 return 的承诺被消息
拒绝
TypeError: store.query is not a function at Object._callee$.
我正在测试的代码没有在任何地方调用 store.query
而且我也存根了 store.peekRecord
所以不确定它是如何被调用的。
您的 getOperations
函数使用 async
语法,因此您需要在测试用例中使用 async/await
。而且,它工作正常。
例如
index.ts
export async function getOperations(customObj, store) {
const obj = foo(customObj, store);
return obj;
}
export function foo(customObj, store) {
return store.peekRecord("obj", 12345);
}
index.test.ts
:
import { getOperations } from "./";
import sinon from "sinon";
import { expect } from "chai";
describe("59639661", () => {
describe("#getOperations", () => {
let customObj, store, someObj;
beforeEach(function() {
someObj = {
id: "-2462813529277062688",
};
store = {
peekRecord: sinon.stub().returns(someObj),
};
});
it("should pass", async () => {
const obj = await getOperations(customObj, store);
expect(obj).to.deep.eq(someObj);
});
});
});
100% 覆盖率的单元测试结果:
59639661
#getOperations
✓ should pass
1 passing (14ms)
---------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
index.test.ts | 100 | 100 | 100 | 100 | |
index.ts | 100 | 100 | 100 | 100 | |
---------------|----------|----------|----------|----------|-------------------|
源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/Whosebug/59639661
我正在尝试使用 mocha 和 sinon.js
为异步函数编写单元测试下面是我的测试用例
describe('getOperations', function () {
let customObj, store, someObj
beforeEach(function () {
someObj = {
id: '-2462813529277062688'
}
store = {
peekRecord: sandbox.stub().returns(someObj)
}
})
it('should be contain obj and its ID', function () {
const obj = getOperations(customObj, store)
expect(obj).to.eql(someObj)
})
})
下面是我正在测试的异步函数的定义。
async function getOperations (customObj, store) {
const obj = foo(topLevelcustomObj, store)
return obj
}
function foo (topLevelcustomObj, store) {
return store.peekRecord('obj', 12345)
}
测试用例失败,因为 return 的承诺被消息
拒绝TypeError: store.query is not a function at Object._callee$.
我正在测试的代码没有在任何地方调用 store.query
而且我也存根了 store.peekRecord
所以不确定它是如何被调用的。
您的 getOperations
函数使用 async
语法,因此您需要在测试用例中使用 async/await
。而且,它工作正常。
例如
index.ts
export async function getOperations(customObj, store) {
const obj = foo(customObj, store);
return obj;
}
export function foo(customObj, store) {
return store.peekRecord("obj", 12345);
}
index.test.ts
:
import { getOperations } from "./";
import sinon from "sinon";
import { expect } from "chai";
describe("59639661", () => {
describe("#getOperations", () => {
let customObj, store, someObj;
beforeEach(function() {
someObj = {
id: "-2462813529277062688",
};
store = {
peekRecord: sinon.stub().returns(someObj),
};
});
it("should pass", async () => {
const obj = await getOperations(customObj, store);
expect(obj).to.deep.eq(someObj);
});
});
});
100% 覆盖率的单元测试结果:
59639661
#getOperations
✓ should pass
1 passing (14ms)
---------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
index.test.ts | 100 | 100 | 100 | 100 | |
index.ts | 100 | 100 | 100 | 100 | |
---------------|----------|----------|----------|----------|-------------------|
源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/Whosebug/59639661