sinon 中的异步函数存根调用实际函数调用
Async Function stubbing in sinon invokes actual function call
我 运行 使用 mocha 进行单元测试时,我有一个异步功能,我看到它没有存根 it.I 没看到 console.log 正在打印登录功能,它看起来实际的 getUser() 函数正在被调用。
// User.js
class User {
async _getUser(client, email) {
let result = await new userApi().getUser(new UserInfo(email, email));
console.log("Get result " + JSON.stringify(result));
let user = result.users[0];
console.log("Get User " + JSON.stringify(user));
return user;
}
}
module.exports = User;
// Usertest.js
const chai = require("chai");
const sinon = require("sinon");
var chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised).should();
const expect = chai.expect;
const UserInfo = require("../src/model/userInfo");
const User = require("../src/model/user");
describe("Test LogInCommand", function() {
let user, sandbox;
beforeEach(() => {
sandbox = sinon.sandbox.create();
user = new user();
});
afterEach(function afterEach() {
sandbox.restore();
});
it("getUser function", function(done) {
let User = new UserInfo("email", "email", "station");
sandbox
.stub(userApi, "getUser")
.withArgs(User)
.returns(
Promise.resolve({
users: [
{
id: 1
}
]
})
);
sandbox.stub(logger, "info");
let result = logInCommand._getUser(client, "email", "stationid");
done();
});
});
我假设 userApi
是一个 class 所以为了存根它,我们必须像下面那样做:
sandbox.stub(userApi.prototype, "getUser").withArgs(User)...
我们必须添加 prototype
来存根 class 的方法。
我还在你的测试中发现了一些需要修复的地方,这是因为你没有将 logInCommand._getUser
视为异步调用。所以,这是更新后的代码。
it("getUser function", async function() { // remove `done` and let's use async/await here
let User = new UserInfo("email", "email", "station");
sandbox
.stub(userApi.prototype, "getUser") // add prototype
.withArgs(User)
.resolves({ // in new sinon, they have `resolves` method
users: [
{
id: 1
}
]
});
sandbox.stub(logger, "info");
let result = await logInCommand._getUser(client, "email", "stationid"); // add await because this method is async
// remove done()
});
希望对您有所帮助
我 运行 使用 mocha 进行单元测试时,我有一个异步功能,我看到它没有存根 it.I 没看到 console.log 正在打印登录功能,它看起来实际的 getUser() 函数正在被调用。
// User.js
class User {
async _getUser(client, email) {
let result = await new userApi().getUser(new UserInfo(email, email));
console.log("Get result " + JSON.stringify(result));
let user = result.users[0];
console.log("Get User " + JSON.stringify(user));
return user;
}
}
module.exports = User;
// Usertest.js
const chai = require("chai");
const sinon = require("sinon");
var chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised).should();
const expect = chai.expect;
const UserInfo = require("../src/model/userInfo");
const User = require("../src/model/user");
describe("Test LogInCommand", function() {
let user, sandbox;
beforeEach(() => {
sandbox = sinon.sandbox.create();
user = new user();
});
afterEach(function afterEach() {
sandbox.restore();
});
it("getUser function", function(done) {
let User = new UserInfo("email", "email", "station");
sandbox
.stub(userApi, "getUser")
.withArgs(User)
.returns(
Promise.resolve({
users: [
{
id: 1
}
]
})
);
sandbox.stub(logger, "info");
let result = logInCommand._getUser(client, "email", "stationid");
done();
});
});
我假设 userApi
是一个 class 所以为了存根它,我们必须像下面那样做:
sandbox.stub(userApi.prototype, "getUser").withArgs(User)...
我们必须添加 prototype
来存根 class 的方法。
我还在你的测试中发现了一些需要修复的地方,这是因为你没有将 logInCommand._getUser
视为异步调用。所以,这是更新后的代码。
it("getUser function", async function() { // remove `done` and let's use async/await here
let User = new UserInfo("email", "email", "station");
sandbox
.stub(userApi.prototype, "getUser") // add prototype
.withArgs(User)
.resolves({ // in new sinon, they have `resolves` method
users: [
{
id: 1
}
]
});
sandbox.stub(logger, "info");
let result = await logInCommand._getUser(client, "email", "stationid"); // add await because this method is async
// remove done()
});
希望对您有所帮助