我在一个文件中有一个API脚本
const ApiCall = {
fetchData: async (url) => {
const result = await fetch(url);
if (!result.ok) {
const body = await result.text(); // uncovered line
throw new Error(`Error fetching ${url}: ${result.status} ${result.statusText} - ${body}`); // uncovered line
}
return result.json();
},
};
export default ApiCall;当我模拟调用时,我在代码覆盖率中有两行未覆盖的代码。
你知道怎样才能让它们也被覆盖吗?
下面是我到目前为止所尝试的方法,它们都不起作用
it('test', async () => {
ApiCall.fetchData = jest.fn();
ApiCall.fetchData.result = { ok: false };
});我对Jest还是个新手,所以任何帮助都会很好。
发布于 2018-01-18 08:31:05
您需要在测试规范中提供stubb响应,以便触发if语句。https://www.npmjs.com/package/jest-fetch-mock将允许您这样做。他们的npm页面上的示例应该会为您提供所需的https://www.npmjs.com/package/jest-fetch-mock#example-1---mocking-all-fetches
基本上,结果存储在state(redux)中,并从那里调用。jest-fetch-mock覆盖api调用/路由,并在框架内以redux的形式返回存储的结果。
发布于 2018-01-20 03:52:15
假设您要测试的是ApiCall,那么您将需要模拟fetch。您模拟的是整个ApiCall,因此这些代码行将永远不会执行。
此外,您还会遇到一个问题,因为如果您发现错误或promise rejection,则json()将不可用,因此该行将触发错误。
试试这个(还没测试过):
it('test error', (done) => {
let promise = Promise.reject(new Error("test"));
global.fetch = jest.fn(() => promise); //You might need to store the original fetch before swapping this
ApiCall.fetchData()
.catch(err => );
expect(err.message).toEqual("test");
done();
});
it('test OK', (done) => {
let promise = Promise.resolve({
json: jest.fn(() => {data: "data"})
});
global.fetch = jest.fn(() => promise);
ApiCall.fetchData()
.then(response => );
expect(response.data).toEqual("data");
done();
});这可能不会马上起作用,但希望你能明白。在本例中,您已经在使用promise,所以可以看到我在测试中添加了done()回调,这样您就可以告诉jest您已经完成了处理。还有一种方法也可以让jest等待承诺,类似于“返回promise.then()”。
请回帖
https://stackoverflow.com/questions/48311274
复制相似问题