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

时间:2018-01-17 22:49:40

标签: javascript reactjs jestjs enzyme

我在文件中有一个API脚本

import cv2
img = cv2.imread('cropped.png')
grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
retval, threshold2 = cv2.threshold(grayscaled,125,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imwrite('threshold.jpeg',threshold2)
print(pytesseract.image_to_string(Image.open('threshold.jpeg') , lang='eng', boxes=False,config='--psm 10 --eom 3 -c tessedit_char_whitelist=0123456789'))

当我模拟通话时,我在代码覆盖范围内有两条未覆盖的行。

任何想法我怎样才能让它们覆盖。

这是我到目前为止所尝试的无法正常工作

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;

我对Jest有点新意,所以任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

您需要在测试规范中提供stubb响应,以便触发if语句。 https://www.npmjs.com/package/jest-fetch-mock将允许您这样做。他们的npm页面上的示例应该为您提供所需的内容https://www.npmjs.com/package/jest-fetch-mock#example-1---mocking-all-fetches

基本上结果存储在状态(redux)中并从那里调用。 jest-fetch-mock会覆盖你的api调用/路由,并在框架内的redux中返回存储的结果。

答案 1 :(得分:0)

假设你要测试的是ApiCall,那么你需要模拟fetch。你正在嘲笑整个ApiCall,所以这些行永远不会执行。

此外,您有一个问题,因为如果您发现错误或承诺拒绝,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等待承诺,就像“return promise.then()”。

请回复