Jest.js 存根当前存储库测试中的其他存储库调用

kulphzqa  于 2023-01-15  发布在  Jest
关注(0)|答案(1)|浏览(172)

我正在尝试为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函数,但它也会调用其他存储库函数,如findByRefTokenwaitthis.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);
        });
    });
});

感谢您的回复

jdgnovmf

jdgnovmf1#

该方法在数据库中创建并保存一个新用户。如果您存根数据库调用,还需要测试什么?
我的建议是不要嘲笑;在数据库中设置适当的结构并使用它们。您可以使用factory-bot来简化此操作。
注意:奇怪的是它没有返回用户。
我会从保存用户中提取出创建用户的过程,还将所有令牌和引用的东西放入它们自己的方法中。

async newNormal(data) {
        const verifyToken = await this.generateToken();
        // create unique ref code
        const tokenid = this.generateTokenId();
        const refToken = await this.generateUniqueRefToken(tokenid);
        const 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
        };

        return {
            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: {
                kyc_verified: false
            };
        };
    }

    async createNormal(data) {
        const userData = await this.newNormal(data);
        return await this.db.one(CREATE_NORMAL_USER, userData);
    }

现在createNormal是一个集成方法,它所做的就是调用newNormal并将结果传递给SQL查询,您可以通过模拟newNormaldb.one来测试它。
重要的工作发生在newNormal上,集中测试它。你可以模拟generateTokengenerateTokenIdgenerateUniqueRefTokenfindByRefToken。但是,同样,这个测试通过设置必要的数据会更容易和更真实。

相关问题