首页 > 解决方案 > 我怎样才能让 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在这种情况下如何使用。

标签: node.jsexpressmongoosejasmine

解决方案


推荐阅读