测试:模拟在类方法中使用的node-fetch依赖项

时间:2017-05-14 05:20:59

标签: testing sinon stub ava

我有以下情况:

A.js

import fetch from 'node-fetch'
import httpClient from './myClient/httpClient'

 export default class{
    async init(){
       const response = await fetch('some_url')
       return httpClient.init(response.payload)
    }
}

A_spec.js

import test from 'ava'
import sinon from 'sinon'
import fetch from 'node-fetch'
import httpClient from './myClient/httpClient'
import A from './src/A'

test('a async test', async (t) => {
    const instance = new A()
    const stubbedHttpInit = sinon.stub(httpClient, 'init')
    sinon.stub(fetch).returns(Promise.resolve({payload: 'data'})) //this doesn't work

    await instance.init()
    t.true(stubbedHttpInit.init.calledWith('data'))
})

我的想法是检查是否使用获取请求中获取的有效负载调用了httpClient的init方法。

我的问题是:当我测试A的init方法时,如何模拟存根的获取依赖关系返回值?

3 个答案:

答案 0 :(得分:3)

sinon.stub(fetch)不能自行存根函数。相反,您需要在node-fetch内部隐藏./src/A依赖关系,可能使用类似proxyquire的内容:

import proxyquire from 'proxyquire`
const A = proxyquire('./src/A', {
  'node-fetch': sinon.stub().returns(Promise.resolve({payload: 'data'}))
})

答案 1 :(得分:3)

最后,我解决了这个问题,如下所示:fetch.Promise引用:

sinon.stub(fetch, 'Promise').returns(Promise.resolve(responseObject))

对此node-fetch引用本机Promise的解释,当您调用fetch()时,此方法返回fetch.PromiseCheck this out

答案 2 :(得分:0)

就我而言,我发现保留npm init功能很有用,因为我的模拟回复已经通过nock

提供了

为了做到这一点,我代理了上面答案中描述的依赖关系,但在间谍中包含了一个require调用:

node-fetch

...

import proxyquire from 'proxyquire'
import { spy } from 'sinon'

const fetchSpy = spy(require('node-fetch'))
const moduleA = proxyquire(
  './moduleA',
 { 'node-fetch': fetchSpy }
)