我有以下情况:
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方法时,如何模拟存根的获取依赖关系返回值?
答案 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.Promise
。 Check 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 }
)