我正在尝试为Node.js后端项目编写测试用例。数据库正在使用pg-promise。我在尝试存根存储库时遇到了问题,它试图调用其他存储库。
下面是存储库文件user.js
async findByRefToken(refToken) {
return await this.db.oneOrNone(`SELECT id FROM useraccount WHERE username = $1`, refToken);
}
async createNormal(data) {
// generate a verify email token
const verifyToken = await this.generateToken();
// create unique ref code
const tokenid = nanoid(Number(env.REF_TOKEN_LENGTH));
const refToken = await this.generateUniqueRefToken(tokenid);
// find the referral's id from the ref token
let referredBy = null;
if(data.referred) {
referredBy = await this.findByRefToken(data.referred);
}
const meta = {
dob: data.dob,
gender: data.gender,
country: data.country,
phone: data.phone,
email_verified: false,
verify_token: verifyToken,
ref_token: refToken,
referred: referredBy ? referredBy.id : null
};
const verificationMeta = {
kyc_verified: false
};
const normalUser = {
id: data.userId,
first_name: data.firstName.trim(),
last_name: data.lastName.trim(),
active: true,
email: data.email.trim().toLowerCase(),
username: data.username.trim(),
role: 'Normal',
password: bcrypt.hashSync(data.password, Number(env.SALT_ROUNDS)),
meta: meta,
verification_meta: verificationMeta
};
const newUser = await this.db.one(CREATE_NORMAL_USER, normalUser);
return {
id: newUser.id,
firstName: data.firstName,
email: data.email,
verifyToken: verifyToken,
refToken: refToken,
referredBy: referredBy
};
}
我正在尝试测试createNormal函数,但它也会调用其他存储库函数,如findByRefToken和waitthis.db.one(CREATE_NORMAL_USER,normalUser);有办法把它们赶走吗?
下面是编写的测试user.test.js
const chai = require("chai");
const sinon = require("sinon");
const expect = chai.expect;
const {faker} = require("@faker-js/faker");
const UserRepository = require("../../repos/user");
describe("UserRepository", function() {
const stubValue = {
dob: faker.date.birthdate(),
gender: faker.name.gender(),
country: faker.address.country(),
phone: faker.phone.number(),
email_verified: false,
id: faker.datatype.uuid(),
firstName: faker.name.firstName(),
lastName: faker.name.lastName(),
username: faker.name.fullName(),
password: faker.random.alphaNumeric(5),
email: faker.internet.email(),
verifyToken: faker.random.alphaNumeric(12),
refToken: faker.random.alphaNumeric(12),
referredBy: faker.random.alphaNumeric(12)
};
describe("create", function () {
it("should add a new user to the db", async function () {
// const stub = sinon.stub(UserRepository, "createNormal").resolves(stubValue.refToken);
const userRepository = new UserRepository();
const user = await userRepository.createNormal(stubValue);
expect(user.id).to.equal(stubValue.id);
expect(user.name).to.equal(stubValue.name);
expect(user.phone).to.equal(stubValue.phone);
expect(user.id).to.equal(stubValue.id);
expect(user.verifyToken).to.equal(stubValue.verifyToken);
});
});
});
感谢您的回复
1条答案
按热度按时间jdgnovmf1#
该方法在数据库中创建并保存一个新用户。如果您存根数据库调用,还需要测试什么?
我的建议是不要嘲笑;在数据库中设置适当的结构并使用它们。您可以使用
factory-bot
来简化此操作。注意:奇怪的是它没有返回用户。
我会从保存用户中提取出创建用户的过程,还将所有令牌和引用的东西放入它们自己的方法中。
现在
createNormal
是一个集成方法,它所做的就是调用newNormal
并将结果传递给SQL查询,您可以通过模拟newNormal
和db.one
来测试它。重要的工作发生在
newNormal
上,集中测试它。你可以模拟generateToken
,generateTokenId
,generateUniqueRefToken
和findByRefToken
。但是,同样,这个测试通过设置必要的数据会更容易和更真实。