首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jest单元测试,模拟函数内IF条件的实现,以实现完整的代码覆盖

Jest单元测试,模拟函数内IF条件的实现,以实现完整的代码覆盖
EN

Stack Overflow用户
提问于 2018-01-18 06:49:40
回答 2查看 5.2K关注 0票数 0

我在一个文件中有一个API脚本

代码语言:javascript
复制
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;

当我模拟调用时,我在代码覆盖率中有两行未覆盖的代码。

你知道怎样才能让它们也被覆盖吗?

下面是我到目前为止所尝试的方法,它们都不起作用

代码语言:javascript
复制
  it('test', async () => {   
    ApiCall.fetchData = jest.fn();
    ApiCall.fetchData.result = { ok: false };
  });

我对Jest还是个新手,所以任何帮助都会很好。

EN

回答 2

Stack Overflow用户

发布于 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的形式返回存储的结果。

票数 0
EN

Stack Overflow用户

发布于 2018-01-20 03:52:15

假设您要测试的是ApiCall,那么您将需要模拟fetch。您模拟的是整个ApiCall,因此这些代码行将永远不会执行。

此外,您还会遇到一个问题,因为如果您发现错误或promise rejection,则json()将不可用,因此该行将触发错误。

试试这个(还没测试过):

代码语言:javascript
复制
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()”。

请回帖

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48311274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档