node.js - 我怎样才能让 Jasmine 在我的期望调用之前等待,以便等待返回数据后执行的代码运行?
问题描述
我刚刚在我的一个节点路由器文件中添加了一条路由,并想为其添加适当的单元测试。路线如下:
router.post('/addtradables', checkIsAdmin, async function(req, res, next) {
const SteamApp = require('../models/steamapp.model');
const Tradable = require('../models/tradable.model');
const User = require('../models/user.model');
const postedTradables = req.body.tradables;
if(postedTradables) {
res.json({ success: true, result: constants.PROCESS_STARTED, textResult: 'The tradables are being added' });
const adminUser = await User.findOne({ steamId: ADMIN_ID }).exec();
for(let currentKey in postedTradables) {
if(postedTradables.hasOwnProperty(currentKey)) {
const currentTradable = postedTradables[currentKey];
const appFound = currentTradable.sku ? await SteamApp.findOne({ appid: currentTradable.sku }).exec() : null;
await new Tradable( { /* object data here */ } ).save();
}
}
} else {
return res.json({ success: false, result: constants.INVALID_FORMAT, textResult: 'No tradable found, check the format' });
}
} );
如您所见,它返回一个带有代码和文本消息的对象,以便前端可以知道该进程是否已启动。这是因为插入过程可能需要一段时间,具体取决于输入数据。
这是我的茉莉花规格文件:
const app = require('../../app');
const request = require('supertest');
const MongoDbTest = require('../../lib/mongodb-tests.lib');
const jwt = require('jsonwebtoken');
const SteamApp = require('../../models/steamapp.model');
const Tradable = require('../../models/tradable.model');
const User = require('../../models/user.model');
const JWT_TOKEN = process.env.JTW_KEY;
const ADMIN_ID = process.env.MASTER_STEAMID;
const constants = require('../../config/constants');
const adminUser = {
role: 'admin',
steamId: ADMIN_ID
};
const testTradable = {
sku: 1234,
barterId: 83838,
extra: 2,
type: 'gift',
title: 'Les patates volent!'
};
describe("route /addtradables", () => {
const mongod = new MongoDbTest();
let testOwner;
beforeAll(async () => {
await mongod.connect();
await new SteamApp({ appid: 1234, name: 'patate' }).save();
testOwner = await new User(adminUser).save();
} );
afterAll(async () => {
await SteamApp.deleteMany({});
await User.deleteMany({});
await mongod.close();
} );
it("devrait retourner un message indiquant que le format est incorrect lorsque c'est le cas", async () => {
const userToken = jwt.sign(adminUser, JWT_TOKEN, { algorithm: 'HS256' });
const response = await request(app).post(`/api/addtradables`).send({ patate: 'pouelle' }).set('Authorization', `Bearer ${userToken}`).expect('Content-Type', /json/);
expect(response.statusCode).toBe(200);
expect(response.body.success).toBe(false);
expect(response.body.result).toBe(constants.INVALID_FORMAT);
} );
it("devrait retourner un message indiquant que le processus a débuté lorsque le format est correct", async () => {
const userToken = jwt.sign(adminUser, JWT_TOKEN, { algorithm: 'HS256' });
const response = await request(app).post(`/api/addtradables`).send({ tradables: { 9837489374: testTradable } }).set('Authorization', `Bearer ${userToken}`).expect('Content-Type', /json/);
expect(response.statusCode).toBe(200);
expect(response.body.success).toBe(true);
/*
I WANT TO WAIT HERE! If I don't wait for the router.post call to finish the data will not be available in the database
*/
const insertedTradable = await Tradable.findOne({ appid: 1234 }).exec();
expect(insertedTradable.barterId).toBe(testTradable.barterId);
expect(insertedTradable.isGift).toBe(true);
expect(insertedTradable.copies).toBe(testTradable.extra);
expect(insertedTradable.name).toBe(testTradable.title);
} );
} );
有没有办法监视router.post
通话并检查一切何时完成,以便我可以从数据库中提取数据并检查数据是否正确插入?router.post
除此之外,在通话结束时,在 jasmine 测试例程中休眠/停止执行的最佳方法是什么?我已经研究过使用一个done
函数,但由于代码在路由器内部,我看不出done
在这种情况下如何使用。
解决方案
推荐阅读
- python - Keras 时间序列:在 LSTM 中包含静态和动态变量的建议
- c# - Map/use built-in MySQL function in Entity Framework
- javascript - 'Observable<{}>' 类型上不存在属性 'update'。Firebase 5 AngularFire2 5
- swift - Core data is causing the iPhone crash
- android - Streaming video from xampp, which way?
- html - 使用图像编辑表格列宽百分比
- android - 资源 android:attr/fontVariationSettings 和错误:资源 android:attr/ttcIndex 未找到
- c# - C# 快速元素查找矩阵作为 Matlab
- reactjs - 建立一个反应项目
- django-rest-framework - 在 djangorestframework 中不请求任何页面时禁用分页