首页 > 解决方案 > 使用 jest 测试没有回调的异步函数

问题描述

我目前正在寻找一个异步功能,一个刮板,它可以准确地在给定路线上抓取 Ryan Air 的网站以获取价格。我想测试刮掉的价格实际上是应该的价格。当试图以开玩笑的方式运行它进行测试时,我似乎无法使其正常工作......我查看了谷歌和其他各种网站,它们似乎都有针对具有回调、承诺等的异步函数的解决方案和NOT 没有这些的异步函数。

我的函数将 Ryan Air 上给定路线的 URL 作为参数。

这是我的异步函数(文件名为 scraperProduct.js):

const puppeteer = require('puppeteer');

async function scraperProduct(url){
    console.log('Starting scraper...');
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url);
    await page.waitFor(500);

    //Price departure
    const [el1] = await page.$x('/html/body/flights-root/div/div/div/div/flights-summary-container/flights-summary/div/div[1]/journey-container/journey/div/div[2]/carousel-container/carousel/div/ul/li[3]/carousel-item/button/div[2]/ry-price/span[2]');
    const txt = await el1.getProperty('textContent');
    const Price = await txt.jsonValue();


    //Price return
    const [el6] = await page.$x('/html/body/flights-root/div/div/div/div/flights-summary-container/flights-summary/div/div[2]/journey-container/journey/div/div[2]/carousel-container/carousel/div/ul/li[3]/carousel-item/button/div[2]/ry-price/span[2]');
    const txt6 = await el6.getProperty('textContent');
    const Price2 = await txt6.jsonValue();

    return Price + Price2;
}

module.exports = scraperProduct;

这是我的测试文件(名为 scraperProduct.test.js):

const scraperProduct = require('./scraperProduct');

test("Testing that scraper retrieves correct price from Ryan Air", async () => {
    expect(
        scraperProduct('https://www.ryanair.com/dk/da/trip/flights/select?adults=1&teens=0&children=0&infants=0&dateOut=2020-07-13&dateIn=2020-07-20&originIata=CPH&destinationIata=STN&isConnectedFlight=false&isReturn=true&discount=0')
        ).toBe(698);
});

'toBe(698)' 是 698,因为这是测试中的价格。

我很感激我能得到的任何帮助——这是我第一次使用 jest,所以我有点像个菜鸟。

标签: javascriptunit-testingjestjspuppeteer

解决方案


由于您正在尝试测试一个async函数,因此您需要等待该函数的结果,即 use await

这是测试异步代码时可能的解决方案之一。等待结果,然后进行测试。

const scraperProduct = require('./scraperProduct');

test("Testing that scraper retrieves correct price from Ryan Air", async () => {

    const result = await scraperProduct('https://www.ryanair.com/dk/da/trip/flights/select?adults=1&teens=0&children=0&infants=0&dateOut=2020-07-13&dateIn=2020-07-20&originIata=CPH&destinationIata=STN&isConnectedFlight=false&isReturn=true&discount=0')

    expect(result).toBe(698);
});

推荐阅读