【问题标题】:How do I properly test a function that use axios.get and cheerios.load functions with mocha and chai?如何正确测试使用 axios.get 和 Cheerios.load 函数与 mocha 和 chai 的函数?
【发布时间】:2020-04-12 00:45:14
【问题描述】:

我有这个 index.js 文件

    const axios = require("axios");
    const cheerio = require('cheerio');

    const fetchData = async (webpage) => {
        const result = await axios.get(webpage);
        return cheerio.load(result.data);
    }
    const extractData = async (webPage) => {
        const $ = await fetchData(webPage);
        const numMains = $('.rank').text();
        //Should return the following string 
        //1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.
        return numMains;
    }

    const siteUrl = "https://news.ycombinator.com/";

    (async (webPage) => {console.log(await extractData(webPage));})(siteUrl);

    module.exports = {
        extractData: extractData
    }

我有这个 test.js 文件

    var chai = require('chai');
    var expect = chai.expect;
    var functionNames = require('../index.js');

    describe('extractData() Unit-Test', () => {
      it('This function should return a given string', () => {

        // 1. ARRANGE
        const siteUrl = "https://news.ycombinator.com/";
        const shouldResult = "1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.";

        // 2. ACT
        const result = functionNames.extractData(siteUrl);

        // 3. ASSERT
        expect(result).to.be.equal(shouldResult);

      });
    });

*我没有通过这个 AssertionError: *

    AssertionError: expected {} to equal '1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.'

有人知道我做错了什么,我该如何解决这个问题?

【问题讨论】:

    标签: javascript node.js mocha.js chai


    【解决方案1】:

    您缺少await,您正在将Promise1,2,3 进行比较...

    it('This function should return a given string', async() => {
    
            // 1. ARRANGE
            const siteUrl = "https://news.ycombinator.com/";
            const shouldResult = "1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.";
    
            // 2. ACT
            const result = await functionNames.extractData(siteUrl);
    
            // 3. ASSERT
            expect(result).to.be.equal(shouldResult);
    
    });
    

    请记住,您实际上是在进行测试时执行请求,如果站点关闭,则测试将失败。如果您不希望这样,您可以使用 nock 或类似的包来模拟请求。

    【讨论】:

    • 谢谢,很有用! :) 我怎么能嘲笑它?你能给我举个例子吗?
    • 不客气! nock 文档中有大量示例:npmjs.com/package/nock
    【解决方案2】:

    作为 Marcos 解决方案的替代方案,您还可以使用来自 chai 的 eventually

    result.should.eventually.equal(shouldResult);
    

    此处的文档:https://www.chaijs.com/plugins/chai-as-promised/

    【讨论】:

    • 比更长的期望语法优雅得多。
    猜你喜欢
    • 2015-07-25
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2015-06-02
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多