findOne не является функцией при тестировании с использованием мокко - PullRequest
0 голосов
/ 09 мая 2020

Я тестировал свой «пользовательский» код с помощью mocha и chai, но я продолжаю получать эту ошибку. Файл index. js, который создает модели, строится автоматически и работает нормально. Затем я попытался добавить тесты с использованием мокко и не смог понять причину.

error

мои тестовые папки:

test / user / user_dbtest:

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
	});
});

services / user / user_db:

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}

модели / индекс. 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
	})
}

Заранее спасибо ...

1 Ответ

0 голосов
/ 11 мая 2020

Вы должны использовать библиотеку-заглушку / имитацию, такую ​​как 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;

Поскольку мы тестируем уровень сервиса, уровень модели не имеет значения (мы заглушаем и имитируем модели). Итак, в этом примере нет модельного слоя.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...