【问题标题】:Nodejs Mocha: Unable to test a POST and GET by IDNodejs Mocha:无法通过 ID 测试 POST 和 GET
【发布时间】:2019-08-19 23:12:36
【问题描述】:

尝试测试 POST 请求并通过 ID 获取。对于 POST 错误,它指出:“预期 200,得到 400”。然后对于 3 GET by ID,前两个是“错误:超过 2000 毫秒的超时......”,然后在几分钟后给我这两个 ID。然后是第三个:“预期 404,得到 400”。

尝试查看文档中的 expect、supertest 和 mocha,但找不到解决方案。这 3 个是我用于此测试的内容

这是 POST 测试

describe('POST /drinks', () => {
    it('should create a new drink', (done) => {
        let type = 'coffee';
        let name = 'testName';
        let image = 'testImage';

        request(app)
            .post('/drinks')
            .send({
                type,
                name,
                image
            }).expect(200).expect((res) => {
                expect(res.body.type, res.body.name, res.body.image).toBe(text);
            }).expect((res) => {
                expect(res.body.rating).toBe(number);
            }).end((err, res) => {
                if (err) {
                    return done(err);
                }

                Coffee.find({
                    type
                }).then((feedData) => {
                    expect(feedData.length).toBe(1);
                    expect(feedData[0].type).toBe(text);
                    done();
                }).catch(e => done(e));
            });
    });
});

然后是 GET by ID:

describe('GET /drinks/:id', () => {
    it('should return individual drink document', (done) => {
        request(app)
            .get(`/drinks/${feedData[0]._id.toHexString()}`)
            .expect(200)
            .expect(res => {
                expect(res.body.drink.text).toBe(feedData[0].text);
            })
            .end((err, res) => {
                if (err) return done(err);
                done();
            });
    });

    it('should return 404 if drink is not found', (done) => {
        let hexId = new ObjectID().toHexString();

        request(app)
            .get(`/drinks/${hexId}`)
            .expect(404)
            .end((err, res) => {
                if (err) return done(err);
                done();
            });
    });

    it('should return 404 for non-object ids', (done) => {
        request(app)
            .get('/drinks/123abc')
            .expect(404)
            .end((err, res) => {
                if (err) return done(err);
                done();
            });
    });
});

这是我的 POST 路线:

// POST a drink
exports.postDrinks = (req, res) => {
  let type = req.body.type;
  if (!type) {
    res.status(400).send('Request parameters missing');
  }
  let newDrink;

  // Default Drink Fields
  let defaultFields = {
    type,
    name: req.body.name,
    tastingNotes: req.body.tastingNotes,
    comments: req.body.comments,
    image: req.body.image,
    rating: req.body.rating
  }

  // Determine which type and store it as that type
  switch (type) {
    case 'beer':
      newDrink = new Beer({
        ...defaultFields,
        style: req.body.style,
        source: req.body.source,
      });
      break;
    case 'coffee':
      newDrink = new Coffee({
        ...defaultFields,
        beanType: req.body.beanType,
        brewTime: req.body.brewTime,
        strength: req.body.strength
      });
      break;
    case 'liquor':
      newDrink = new Liquor({
        ...defaultFields,
        typOfLiquor: req.body.typOfLiquor
      });
      break;
    case 'tea':
      newDrink = new Tea({
        ...defaultFields,
        leafType: req.body.leafType,
        steepTime: req.body.steepTime,
      });
      break;
    default:
      console.log('Please select an apprioriate drink');
      break;
  }

  // Saves POST and sends it back as well. If not, then error
  newDrink.save().then((drink) => {
    res.send(drink);
  }, (e) => {
    res.status(400).send(e);
  });
}

这是我通过 ID 获取的路线:

/ GET by ID
exports.getIndividualDrink = (req, res) => {
  let id = req.params.id;

  // Show everything but id and v
  Drink.findById(id).select('-_id -__v').then((drink) => {

    // Check if theres that drink and ID is valid
    if (!drink && !ObjectID.isValid(id)) {
      return res.status(401).send();
    }

    // If there is, then send it back
    res.send({
      drink
    });
  }, (e) => {
    res.status(400).send(e);
  });
};

预期应该会通过,但就像我说的那样,结果是: 1) POST:'错误:预期 200,得到 400' 2)前两个 GET by ID:'错误:超过 2000 毫秒的超时。 ......' 3) Last GET by ID: 'Expected 404, got 400'

【问题讨论】:

    标签: javascript node.js mocha.js supertest


    【解决方案1】:

    400 Bad Request 错误是一个 HTTP 状态代码,表示您发送到服务器的请求在某种程度上不正确或已损坏,服务器无法理解。 尝试检查您的架构,如果您错过了 400 被抛出的内容,您应该发布所有必需的项目。

    【讨论】:

    • 谢谢您,我必须弄清楚这一点。在超时错误的情况下,我在那里做错了什么?
    • @JasonChiang Timeout 是一个 HTTP 状态代码,当对服务器的请求花费的时间超过服务器分配的超时窗口时,它会返回给客户端,我认为您必须更改服务器的默认超时设置.
    猜你喜欢
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2020-08-22
    • 2023-03-23
    相关资源
    最近更新 更多