如何为 Inquirer.js 编写单元测试?
How to write unit tests for Inquirer.js?
我想知道如何为 npm 包编写单元测试 Inquirer.js, which is a tool to make CLI package more easily. I have read 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 的理解还不够好。你能帮我做这个单元测试吗?
您只需模拟或存根您不想测试的任何功能。
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
})
})
有库可以帮助 mocking/stubbing,比如 sinon。
在这种情况下,模拟 inquirer.prompt
也更容易,因为 .prompt
只是主导出 inquirer
上的一个 属性,它将引用同一个对象在 module.js
和 module.test.js
中。对于更复杂的场景,有一些库可以提供帮助,例如 proxyquire。或者,您可以以一种帮助您轻松切换依赖项以进行测试的方式创建模块。例如:
module.js
- 让它成为一个 "factory" 函数,其中 returns 你的主函数自动注入依赖项(通过默认参数)或手动。
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'))
})
})
使用 inquirer.js
和 jest
测试框架
- 模拟
inquirer
- 模拟
.prompt
响应
模块-test.js
import module from './module';
import inquirer from 'inquirer';
jest.mock('inquirer');
describe('Module test', () => {
test('user input', async () => {
expect.assertions(1);
inquirer.prompt = jest.fn().mockResolvedValue({ email: 'some@example.com' });
await expect(module()).resolves.toEqual({ email: 'some@example.com' });
});
});
(使用 ES6 或 TypeScript 语法。)
我想知道如何为 npm 包编写单元测试 Inquirer.js, which is a tool to make CLI package more easily. I have read 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 的理解还不够好。你能帮我做这个单元测试吗?
您只需模拟或存根您不想测试的任何功能。
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 }) })
有库可以帮助 mocking/stubbing,比如 sinon。
在这种情况下,模拟 inquirer.prompt
也更容易,因为 .prompt
只是主导出 inquirer
上的一个 属性,它将引用同一个对象在 module.js
和 module.test.js
中。对于更复杂的场景,有一些库可以提供帮助,例如 proxyquire。或者,您可以以一种帮助您轻松切换依赖项以进行测试的方式创建模块。例如:
module.js
- 让它成为一个 "factory" 函数,其中 returns 你的主函数自动注入依赖项(通过默认参数)或手动。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')) }) })
使用 inquirer.js
和 jest
测试框架
- 模拟
inquirer
- 模拟
.prompt
响应
模块-test.js
import module from './module';
import inquirer from 'inquirer';
jest.mock('inquirer');
describe('Module test', () => {
test('user input', async () => {
expect.assertions(1);
inquirer.prompt = jest.fn().mockResolvedValue({ email: 'some@example.com' });
await expect(module()).resolves.toEqual({ email: 'some@example.com' });
});
});
(使用 ES6 或 TypeScript 语法。)