2

我正在尝试测试一个使用 Tape 调用 API 的异步函数,但我似乎运气不佳。我以前用过 Mocha/Chai 和 Jasmine,但我不知道如何在这里做我想做的事。

这是我要测试的功能

const logicGetMovies = async (genre, page) => {

  numCheck(genre, 'genre')
  numCheck(page, 'page')
  stringCheck(process.env.API_KEY,'process.env.API_KEY')

  const url = `https://api.themoviedb.org/3/discover/movie?with_genres=${genre}&api_key=${process.env.API_KEY}&page=${page}&sort_by=vote_average.desc`

  try {
    return await axios.get(url)
  } catch (e) {
    throw new APIError(e.message)
  }
}

它依赖于两个抛出 APIErrors 的辅助函数(我自己的错误类型)

const numCheck = (num, name) => {
  if (!num) throw new APIError(`${name} is missing`)
  if (typeof num !== 'number' || num <= 0) throw new APIError(`${name} must be a number greater than 0`)
}

const stringCheck = (string, name) => {
  if (!string) throw new APIError(`${name} is missing`)
  if (typeof string !== 'string') throw new APIError(`${name} must be of type string`)
}

我已经尝试过这个磁带测试,但它都失败了并且没有发现错误

const test = require('tape')
const logic = require('../../logic')
const APIError = require('../../logic/APIError')

test('getMovies should throw error with missing genre',(t) =>{
  t.throws(logic.logicGetMovies(null,1),APIError,'genre is missing')

})

我尝试将其更改为async但没有帮助。

const test = require('tape')
const logic = require('../../logic')
const APIError = require('../../logic/APIError')

test('getMovies should throw error with missing genre', async (t) => {
  t.throws(logic.logicGetMovies(null, 1), APIError, 'genre is missing')
  t.end()
})

显然我在这里迷路了。任何线索或答案将不胜感激!

4

2 回答 2

3

函数async永远不会抛出错误......

...它返回 aPromise可能会因错误而拒绝。

因此,测试返回Promise的内容以验证它是否因预期错误而拒绝。

需要使用类似Promisetapetape-promise.

这是一个简化的示例:

const tape = require('tape');
const _test = require('tape-promise').default;
const test = _test(tape);

const func = async () => {
  throw new Error('the error');
};

test('should reject', async (t) => {
  await t.rejects(func(), Error, 'the error');  // Success!
});
于 2019-04-15T22:18:34.473 回答
0

这就是我测试异步错误抛出的方式:

test('fetchData()', async (t) => {
  try {
    await fetchData();
    t.fail('it should throws an error');
  } catch (e) {
    t.pass('it should throws an error');
  }
}

如果错误抛出,catch 块将捕获错误并产生一个通过的测试。

否则,t.fail()将被执行并产生一个失败的测试。

于 2021-01-27T06:36:56.150 回答