【问题标题】:Jest Mockgoose Doc.save() doesn't work async/awaitJest Mockgoose Doc.save() 不能异步/等待
【发布时间】:2018-12-22 05:14:30
【问题描述】:

我在我的电子商务软件上使用 jest,因此我还可以在端到端测试时进行渲染测试(支持主题,这就是原因)。
但我目前只是在测试一些猫鼬功能,当我尝试保存文档时,它给了我这个错误: Error: Timeout - Async callback was not invoked within the 10000ms timeout specified by jest.setTimeout.

我注意到,当我删除带有await doc.save(); 的行时,它没有给出该错误。 所以我认为它与async/await有关,但我找不到它。

package.json

"jest": {
  "automock": false,
  "moduleDirectories": [
    "node_modules"
  ],
  "testPathIgnorePatterns": [
    "node_modules",
    ".idea",
    "public"
  ],
  "collectCoverage": true,
  "coverageThreshold": {
    "global": {
      "branches": 5,
      "lines": 40,
      "functions": 25,
      "statements": -1000
    }
  },
  "setupTestFrameworkScriptFile": "./setupJest.js",
  "coverageDirectory": "coverage",
  "globalSetup": "./globalSetupJest.js"
}

globalSetupJest.js

const Mongoose = require('mongoose').Mongoose;
const mongoose = new Mongoose();

const Mockgoose = require('mockgoose').Mockgoose;
const mockgoose = new Mockgoose(mongoose);
const {promisify} = require('util');

module.exports = async () => {
    try {

        await mockgoose.prepareStorage();
        promisify(mongoose.connect);

        await mongoose.connect('mongodb://localhost/test')

        mongoose.connection.on('connected', () => {
            console.log('db connection is now open');
        });

    } catch (e) {
        console.log('error in setting up mockgoose', e);
    }
};

Product.test.js

describe('Product', () => {
    const index = require('./index');
    const productSchema = require('./model');

    const Product = mongoose.model(index.modelName, productSchema);

    describe('Instance Functionality', () => {
        let baseProductObj;
        let localProduct;

        beforeEach(async () => {
            baseProductObj = {
                ean: 123456789,
                title: 'Test product',
                description: 'Test description',
                stock: {
                    amount: 5,
                    track: true
                },
                pricing: {
                    cost: 5,
                    price: 10
                },
                url: 'test-product'
            };
            localProduct = new Product(baseProductObj);
            try {
                return await localProduct.save();
            } catch (e) {
                console.log('error in beforeEach', e);
            }
        });

        describe('.reduceStock', () => {
            test('Should decrease the stock by a default of 1', async () => {
                try {
                    localProduct.reduceStock();
                    await localProduct.save();
                } catch (e) {
                    console.log('error in saving localProduct', e);
                }
                expect(localProduct.stock.amount).toEqual(4);
            });
        });
    });
});

【问题讨论】:

  • 那些 try..catch 具有误导性。您在测试中不需要它们。诚实的拒绝是可取的。我不明白为什么应该超时。可能是数据库连接问题。

标签: javascript node.js mongoose jestjs mockgoose


【解决方案1】:

您可以通过添加在测试中指定更大的超时时间:

jest.setTimeout(50000);

【讨论】:

    【解决方案2】:

    我已经有一段时间没有使用 JEST,但我认为您需要为异步代码“完成”回调。

    你的代码应该是:

    test("Should decrease the stock by a default of 1", async (done) => {
      try {
        localProduct.reduceStock();
        await localProduct.save();
        done();
      } catch (e) {
        console.log("error in saving localProduct", e);
      }
      expect(localProduct.stock.amount).toEqual(4);
    });
    

    如果这不起作用,请尝试退回文档。

    await localProduct.save();
    

    应该是

    return await localProduct.save();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2016-07-07
      • 2016-03-25
      • 2017-10-09
      • 1970-01-01
      相关资源
      最近更新 更多