期待之后的所有内容都没有被调用

时间:2017-11-22 09:05:16

标签: javascript testing jest babel-jest

我的开玩笑没有像我期望的那样工作。见:

const res = {
        send: (content) => {

            expect(content).toEqual({
                app_status: 501,
                errors: {
                    jwt: {
                        location: 'body',
                        param: 'jwt',
                        value: undefined,
                        msg: 'The jwt is required'
                    }
                }
            });

            console.log("after expect");

            done();

        },
};

基本上没有调用expect(content).toEqual ...res.send之后的所有内容。我觉得很困惑。我没有收到任何错误,除非我的测试花费的时间太长(因为done)没有被调用且测试没有“关闭”。所以我的问题是,我明显错过了什么吗?

1 个答案:

答案 0 :(得分:-1)

以下应该可以正常工作。我添加了异步,因为send可以异步调用:

const createResponse = () => {
  var resolve;
  const p = new Promise(
    (r,reject)=>resolve=r
  );
  return [
    {
      send: (value) => {
        resolve(value)
      }
    },
    p
  ];
};

test('(async) fail', done => {
  //Router
  const router = express.Router();
  //Endpoint to fetch version
  router.get('/api/version', (req, res) => {
    setTimeout(x=>res.send('v1'),10)
  });
  const request = {
    method: 'GET'
  };
  let [response,p] = createResponse()
  router.stack[0].handle(request, response, () => {});
  p.then(
    x=>expect(x).toBe('v2'),
    reject=>expect("should not reject").toBe(reject)
  ).then(
    x=>done()
    //,x=>done() //this will cause all tests to pass
  );
});

在评论中回答你的问题;请考虑以下代码:

const express = require('express');

const router = express.Router();
//Endpoint to fetch version
router.get('/api/version', (req, res) => {
  res.send("Hello World");
});
const request = {
  method: 'GET'
};
const response = {
  send: (value) => {
    debugger;//pause here and see the stack
    throw new Error("Hello Error.");
  }
};
router.stack[0].handle(
  request,
  response, 
  //this is the function done in route.js:
  // https://github.com/expressjs/express/blob/master/lib/router/route.js#L127
  err => {
    console.error(err.message);//console errors Hello Error.
  }
);

发送抛出错误但发送由您的模拟调用,由快递here调用。所以表达捕获异常,然后结束heredone不仅仅是你的回调)。

所以它会调用你的回调并出现错误,从jist中跳过done并且不抛出任何东西(可能在日志中显示某些内容)。由于你的回调没有做任何事情,它会超时。

你可以尝试在回调中(done)从jist中调用console.error(err.message);

<强> [UPDATE]

小心翼翼地尝试捕捉expect以下引发的错误将告诉我1次测试通过:

test('(async) fail', done => {
  try{
    expect(true).toBe(false);
  }catch(e){

  }
  done();
});