gpt4 book ai didi

node.js - 如何为 Inquirer.js 编写单元测试?

转载 作者:搜寻专家 更新时间:2023-10-31 23:10:48 25 4
gpt4 key购买 nike

我想知道如何为 npm 包编写单元测试 Inquirer.js ,这是一个使 CLI 打包更容易的工具。我读过this post但我无法让它发挥作用。

这是我需要测试的代码:

const questions = [
{
type: 'input',
name: 'email',
message: "What's your email ?",
},
{
type: 'password',
name: 'password',
message: 'Enter your password (it will not be saved neither communicate for other purpose than archiving)'
}
];

inquirer.prompt(questions).then(answers => {
const user = create_user(answers.email, answers.password);
let guessing = guess_unix_login(user);
guessing.then(function (user) {
resolve(user);
}).catch(function (message) {
reject(message);
});
} );

...这是用 Mocha 编写的测试:

describe('#create_from_stdin', function () {
this.timeout(10000);
check_env(['TEST_EXPECTED_UNIX_LOGIN']);
it('should find the unix_login user and create a complete profile from stdin, as a good cli program', function (done) {
const user_expected = {
"login": process.env.TEST_LOGIN,
"pass_or_auth": process.env.TEST_PASS_OR_AUTH,
"unix_login": process.env.TEST_EXPECTED_UNIX_LOGIN
};
let factory = new profiler();
let producing = factory.create();
producing.then(function (result) {
if (JSON.stringify(result) === JSON.stringify(user_expected))
done();
else
done("You have successfully create a user from stdin, but not the one expected by TEST_EXPECTED_UNIX_LOGIN");
}).catch(function (error) {
done(error);
});
});
});

我想用 process.env.TEST_LOGIN(回答第一个 Inquirer.js 问题)和 process.env.TEST_PASS_OR_AUTH(回答第二个 Inquirer.js 问题)以查看该函数是否创建了一个有效的配置文件(具有由工厂对象的方法 create 猜测的值 unix_login)。

我试图了解 Inquirer.js 是如何对自身进行单元测试的,但我对 NodeJS 的了解还不够好。你能帮我做这个单元测试吗?

最佳答案

您只需模拟或 stub 您不想测试的任何功能。

  • module.js - 您要测试的模块的简化示例

    const inquirer = require('inquirer')

    module.exports = (questions) => {
    return inquirer.prompt(questions).then(...)
    }
  • module.test.js

    const inquirer = require('inquirer')
    const module = require('./module.js')

    describe('test user input' () => {

    // stub inquirer
    let backup;
    before(() => {
    backup = inquirer.prompt;
    inquirer.prompt = (questions) => Promise.resolve({email: 'test'})
    })

    it('should equal test', () => {
    module(...).then(answers => answers.email.should.equal('test'))
    })

    // restore
    after(() => {
    inquirer.prompt = backup
    })

    })

有一些库可以帮助模拟/ stub ,比如 sinon .

在这种情况下,模拟 inquirer.prompt 也更容易,因为 .prompt 只是主导出 inquirer 上的一个属性,它将在 module.jsmodule.test.js 中引用同一个对象。对于更复杂的场景,有一些库可以提供帮助,例如 proxyquire .或者,您可以以一种帮助您轻松切换依赖项以进行测试的方式创建模块。例如:

  • module.js - 使其成为一个“工厂”函数,它返回您的主函数,并自动(通过默认参数)或手动注入(inject)依赖项。

    module.exports = ({
    inquirer = require('inquirer'),
    } = {}) => (questions) => {
    return inquirer.prompt(questions).then(...)
    }
  • module.test.js

    const module = require('./module.js')

    describe('test user input' () => {

    const inquirer = {prompt: () => Promise.resolve({email: 'test'})};

    it('should equal test', () => {
    module({inquirer})(...).then(answers => answers.email.should.equal('test'))
    })
    })

关于node.js - 如何为 Inquirer.js 编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49862039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com