首页 > 解决方案 > beforeEach fetch() - 将 res 传递给 'it' 函数

问题描述

在 mocha/chai TDD 测试中,这个 API 调用真的很挣扎,我正在尝试设置。

基本上,beforeEach()测试,我想进行 fetch api 调用。然后将 my 传递给res每个it()函数,这样我就可以对响应运行单独的测试。

我的 beforeEach() 函数似乎可以工作,因为我可以成功地 console.log(res)。

但是,当我的it()函数/测试运行时出现以下错误:

错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保调用了“done()”;如果返回 Promise,请确保它已解决。

如果我添加done()到我的 beforeEach 函数中,但这并不能解决问题。然后我收到一个新错误,我似乎无法解决:

 Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.

我迷失了如何解决这个问题。如何成功运行我的beforeEach(), 并将 for resit()成功传递给每个后续函数?

这是我的代码:

describe('1) Check for succcessful fetech API call', () => {
beforeEach( async (done) => {
   await fetch('https://pixabay.com/api/?key=9656065-a4094594c34f9ac14c7fc4c39&q=manhattan&image_type=photo&page=1&per_page=9')
    .then((res) => {
        console.log(res);
        return res.json();
    })
    done();
});

it('a) Should return an object, with an array count of 9 elements', function(res) {
        console.log(res);
        // expect(res).to.be.an('object');
        // expect(res.hits).to.have.lengthOf(9);
})

这是我的控制台.logging beforeEach()

Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: 
   { body: 
      Gunzip {
        _readableState: [ReadableState],
        readable: true,
        domain: null,
        _events: [Object],
        _eventsCount: 7,
        _maxListeners: undefined,
        _writableState: [WritableState],
        writable: true,
        allowHalfOpen: true,
        _transformState: [Object],
        bytesRead: 0,
        _handle: [Zlib],
        _hadError: false,
        _writeState: [Uint32Array],
        _outBuffer: <Buffer 7b 22 74 6f 74 61 6c 48 69 74 73 22 3a 35 30 30 2c 22 68 69 74 73 22 3a 5b 7b 22 6c 61 72 67 65 49 6d 61 67 65 55 52 4c 22 3a 22 68 74 74 70 73 3a 2f ... >,
        _outOffset: 0,
        _level: -1,
        _strategy: 0,
        _chunkSize: 16384,
        _flushFlag: 2,
        _scheduledFlushFlag: 0,
        _origFlushFlag: 2,
        _finishFlushFlag: 2,
        _info: undefined },
     disturbed: false,
     error: null },
  [Symbol(Response internals)]: 
   { url: 'https://pixabay.com/api/?key=9656065-a4094594c34f9ac14c7fc4c39&q=manhattan&image_type=photo&page=1&per_page=9',
     status: 200,
     statusText: 'OK',
     headers: Headers { [Symbol(map)]: [Object] },
     counter: 0 } }

标签: javascriptapipromisemocha.jschai

解决方案


beforeEach,我们应该选择坚持async/await或坚持promise。不要混合它们,因为这是不必要的。

async/await

describe("1) Check for succcessful fetech API call", () => {
  let res; // define variable to store the response

  beforeEach(async () => { // define async
    const response = await fetch(
      "https://pixabay.com/api/?key=9656065-a4094594c34f9ac14c7fc4c39&q=manhattan&image_type=photo&page=1&per_page=9"
    );
    res = response.json(); // store the response to our variable
  });

  it("a) Should return an object, with an array count of 9 elements", function(res) {
    console.log(res);    
  });
});

或者,对于promise

describe("1) Check for succcessful fetech API call", () => {
  let res; // define variable to store the response

  beforeEach((done) => { // specify done
    fetch(
      "https://pixabay.com/api/?key=9656065-a4094594c34f9ac14c7fc4c39&q=manhattan&image_type=photo&page=1&per_page=9"
    ).then((response) => {      
      res = response.json(); // store the response to our variable
      done(); // call done here once promise is resolved
    })    
  });

  it("a) Should return an object, with an array count of 9 elements", function(res) {
    console.log(res);    
  });
});

希望能帮助到你!


推荐阅读