【发布时间】:2019-12-09 14:01:34
【问题描述】:
试图模拟 Axios 调用 单元测试来自我们身份软件的令牌响应。 Axios 根本没有被调用,因此我的返回总是未定义的。
我已经尝试将 Axios 调用更改为 axios.post 并更改我已经多次模拟的方式,然后我可以数数。我不认为我应该为 Axios 安装另一个模拟框架来模拟这个功能。
实施:
async getAuthToken() {
const oauthUrl = process.env.OAUTHURL;
const oauthAudience = process.env.OAUTHAudience;
const oauthUsername = process.env.OAUTHUSERNAME;
const oauthPassword = process.env.OAUTHPASSWORD;
let urlForAuth = oauthUrl
urlForAuth = urlForAuth + '/as/token.oauth2?';
urlForAuth = urlForAuth + 'grant_type=client_credentials';
urlForAuth = urlForAuth + '&aud=' + oauthAudience + '/';
urlForAuth = urlForAuth + '&scope=' + oauthAudience + '/.read';
const options = {
method: 'POST',
url: urlForAuth,
headers: {
'Authorization': "Basic " + Buffer.from(oauthUsername + ":" + oauthPassword).toString("base64")
},
responseType: 'json'
};
try{
let response = await axios(options);
return response.data.access_token;
}
catch(e){
console.log(e);
throw e;
}
}
测试用例:
test('token Is Returned', async () => {
expect.hasAssertions();
let Response = `{
"access_token": "thisisatoken",
"token_type": "Bearer",
"expires_in": 3599
}`;
axios = jest.fn(() => Promise.resolve());
axios.mockImplementationOnce(() =>
Promise.resolve({
data: Response
})
);
let response = await AuthService.getAuthToken();
expect(axios).toHaveBeenCalledTimes(1);
expect(response).toEqual("thisisatoken");
});
我得到的错误是
预期的模拟函数被调用了一次,但它被调用了零次。
当我调试响应中的数据元素时,包含以下内容:
data:"Copyright (c) 2019 Next Small Things\n"
这在我的代码中没有。帮助。
【问题讨论】:
-
您需要知道为什么会发生这种情况
Expected mock function to have been called one time, but it was called zero times.这是因为您希望jest.fn()已被调用了1 次expect( jest.fn() ).toHaveBeenCalledTimes( 1 )但该函数从未调用过。所以请阅读这里的文档jestjs.io/docs/en/expect#tohavebeencalledtimesnumber -
@Ekaputra 我相信作者明白这一点。并询问我们没有调用 mock 的原因可能是什么。
标签: node.js unit-testing axios jestjs mocking