2

我的笑话没有像我预期的那样奏效。看:

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();

        },
};

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

4

1 回答 1

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

Send 抛出一个错误,但是你的模拟调用了 send ,这里的 express 调用了它。所以 express 捕获了异常,然后在这里结束(done不仅仅是来自你的回调)。

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

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

[更新]

仔细尝试捕获expect以下引发的错误将告诉我 1 次测试通过:

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

  }
  done();
});
于 2017-11-23T14:36:08.247 回答