测试:模拟在类方法中使用的节点获取依赖项

Gon*_*bia 5 testing stub sinon ava

我有以下情况:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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'))
})
Run Code Online (Sandbox Code Playgroud)

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

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

Gon*_*bia 8

最后我解决了这个问题,fetch.Promise像这样存根参考:

sinon.stub(fetch, 'Promise').returns(Promise.resolve(responseObject))
Run Code Online (Sandbox Code Playgroud)

对此的解释是对本node-fetch机 Promise 的引用,当您调用时fetch(),此方法返回一个fetch.Promise. 看一下这个

  • 这不适用于打字稿。当我尝试编写上述确切代码时,出现以下错误:“Promise”类型的参数不可分配给“isRedirect”类型的参数。 (2认同)

Mar*_*ben 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'}))
})
Run Code Online (Sandbox Code Playgroud)