使用mocha和chai测试获取

时间:2017-01-04 15:14:12

标签: javascript testing mocha fetch chai

我有以下示例测试:

import { assert } from 'chai'

function starWarsMovies () {
  fetch('http://swapi.co/api/films/')
    .then((res) => {
         return res.json()
     })
     .then((res) => res.count)
}

describe('Get star war movies', () => {
  it('should get 7', () =>{
    assert.equal(starWarsMovies(), 7)
  })
})

但我得到了

ReferenceError: fetch is not defined

我必须使用什么来测试获取请求。

更新

我也尝试过:

import { polyfill } from 'es6-promise'
import fetch from 'isomorphic-fetch'

然后我得到:

AssertionError: expected undefined to equal 7

我不明白为什么。

2 个答案:

答案 0 :(得分:2)

您可能正在使用node.js测试代码服务器端。

fetch不是节点的一部分,但是是一个网络API,您可以使用较新的浏览器,并可以在浏览器中运行JavaScript。

您需要导入下面草绘的节点提取,它将起作用:

npm install node-fetch --save

并在您的代码中:

const fetch = require("node-fetch")
...

如果您正在运行(较旧的浏览器不支持提取)并且没有使用像webpack这样的工具,则必须使用旧的“传统方式”来包含html中的polyfill。

答案 1 :(得分:2)

即使您使用node-fetch或isomorphic-fetch,这里的问题也在于您正在检查数字与不返回任何内容的函数结果之间是否相等。我能够完成这项工作!

describe('Get star war movies', () => {
    it('should get 7', async () => {
        await fetch('http://swapi.co/api/films/')
            .then((res) => {
                return res.json()
            })
            .then((res) => {
                console.log(res);
                assert.equal(res.count, 7)
            })
    })
})

请注意,我在这里使用async await语法。我们可以通过许多不同的方式来执行此操作(回调,promise,异步/等待),但是关键是在调用API时,我们必须等待结果。另外,从“星球大战” API获得的响应似乎是一个巨大的对象,因此我冒昧地假设您只是在检查计数!