gpt4 book ai didi

javascript - 使用 mocha 进行测试时 findOne 不是函数

转载 作者:行者123 更新时间:2023-12-03 22:23:15 25 4
gpt4 key购买 nike

我正在用 mocha 和 chai 测试我的“用户”代码,但我不断收到此错误。创建模型的 index.js 文件是自动构建的并且工作正常。然后我尝试使用 mocha 添加测试,但找不到原因。

error

我的测试文件夹:

测试/用户/用户数据库测试:

const {expect}=require('chai')
const{usernameExists}=require('../../services/user/user_db')

describe('user db tests',()=>{
it('check whether username alreddy exists',async()=>{
const check=await usernameExists('')
expect(check).to.be.false
expect(check===null).to.be.false
expect(check===undefined).to.be.false
});
});


服务/用户/用户数据库:

const db=require('../../models/index.js')
async function usernameExists(username){
const user= await db.user.findOne({
where:{username}
});
if(user) return user
return false
}
module.exports={usernameExists}


模型/index.js :

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const config = require('../config/config');
const db = {};
console.log(config)

const sequelize=new Sequelize(config.db.database,config.db.username,config.db.password,{
dialect:'mysql',
host:config.db.host
})

fs
.readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
const model = sequelize['import'](path.join(__dirname, file));
db[model.name] = model;
});

Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

//ASSOCIATIONS
db.book_belongs_to.belongsTo(db.user)
db.book_belongs_to.belongsTo(db.book)
db.book_bought_by.belongsTo(db.user)
db.book_bought_by.belongsTo(db.book)


sequelize
.authenticate()
.then(()=>{
console.log("connected");
})
.catch(err=>{
console.error(err);
});

module.exports = db;


模型/用户.js

'use strict';

module.exports=(sequelize,Datatypes)=>{
return sequelize.define('user',{
username:{
type:Datatypes.STRING,
allowNull:false
},
firstname:{
type:Datatypes.STRING,
allowNull:false
},
middlename:{
type:Datatypes.STRING,
},
lastname:{
type:Datatypes.STRING,
allowNull:false
},
email:{
type:Datatypes.STRING,
allowNull:false,
isEmail:true
},
password:{
type:Datatypes.STRING,
allowNull:false
}},{
timestamps:false,
freezeTableName:true
})
}


提前致谢...

最佳答案

您应该使用 stub /模拟库,例如 sinon.js 来模拟 db.user.findOne 方法。

例如。
user_db.js :

const db = require('./index.js');

async function usernameExists(username) {
const user = await db.user.findOne({
where: { username },
});
if (user) return user;
return false;
}

module.exports = { usernameExists };
index.js :

// simulate sequelize db
const db = {
user: {
findOne() {},
},
};

module.exports = db;

因为我们正在测试服务层,模型层并不重要(我们 stub 和模拟模型)。所以,在这个例子中没有模型层。
user_db.test.js :

const { expect } = require('chai');
const sinon = require('sinon');
const { usernameExists } = require('./user_db');
const db = require('./index.js');

describe('user db tests', () => {
afterEach(() => {
sinon.restore();
});
it('should return non-existed user', async () => {
sinon.stub(db.user, 'findOne').resolves(false);
const check = await usernameExists('');
expect(check).to.be.false;
expect(check === null).to.be.false;
expect(check === undefined).to.be.false;
});

it('should return existed user', async () => {
const fakeUser = { username: 'anna' };
sinon.stub(db.user, 'findOne').resolves(fakeUser);
const check = await usernameExists('');
expect(check).to.be.deep.equal({ username: 'anna' });
});
});

带有覆盖率报告的单元测试结果:

  user db tests
✓ should return non-existed user
✓ should return existed user


2 passing (27ms)

------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
------------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 50 | 100 |
index.js | 100 | 100 | 0 | 100 |
user_db.js | 100 | 100 | 100 | 100 |
------------|---------|----------|---------|---------|-------------------

源代码: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/61695519

关于javascript - 使用 mocha 进行测试时 findOne 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61695519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com