代码之家  ›  专栏  ›  技术社区  ›  CherryNerd Robert Markovski

Jest Mockgoose Doc.save()不工作,异步/等待

  •  0
  • CherryNerd Robert Markovski  · 技术社区  · 8 年前


    但我目前正在测试一些mongoose功能,当我试图保存文档时,它会给我一个错误: Error: Timeout - Async callback was not invoked within the 10000ms timeout specified by jest.setTimeout.

    我注意到当我用 await doc.save(); .

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

    产品.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);
                });
            });
        });
    });
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   Faheem    8 年前

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

    你的代码应该是:

    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();
    
        2
  •  -1
  •   Tiago Peres damanpreet singh    8 年前

    通过添加以下内容,可以在测试中指定更大的超时:

    jest.setTimeout(50000);
    
    推荐文章