将这些常见断言保存在单独的文件中而不重复是个好主意吗?我是这样写的,因为它是bdd格式。如果是,我该怎么做
var expect = require('chai').expect;
var request = require('request');
var chai = require('chai')
, chaiHttp = require('chai-http');
chai.use(chaiHttp);
var should = chai.should();
describe('Employees', function() {
var url = 'http://localhost:3000';
it('Returns Employees', function(done) { // <= Pass in done callback
chai.request(url)
.get('/employees')
.end(function(err, res) {
expect(res).to.have.status(200);
res.should.be.json;
res.body.forEach((item) => {
item.should.have.property("first_name");
item.should.have.property("last_name");
item.should.have.property("email");
item.should.have.property("id");
})
done(); });
});
it('Add an Employee', function(done) { // <= Pass in done callback
chai.request(url)
.post('/employees')
.send({"first_name": "asdad", "last_name": "asdasd", "email": "asdasd@example.com"})
.end(function(err, res) {
expect(res).to.have.status(201);
res.should.be.json;
res.body.should.have.property("first_name");
res.body.should.have.property("last_name");
res.body.should.have.property("email");
global.idVariable = res.body.id;
done(); });
});
下面似乎只是在重复:
expect(res).to.have.status(200);
res.should.be.json;
res.body.forEach((item) => {
item.should.have.property("first_name");
item.should.have.property("last_name");
item.should.have.property("email");
item.should.have.property("id");
})
也许您可以将这些常见的与Employee相关的断言封装到一个函数中然后为每个需要断言Employee响应以验证通用员工属性的测试,在每个测试的基础上调用此EmployeeAssertion函数。我不知道将这个断言检查分离到另一个文件中是否有意义,除非在多个测试文件中需要您的员工断言检查功能。需要记住的主要一点是:每个单独的单元测试都应该测试一件事,并且应该相互隔离创建一个共享断言函数来实现(DRY(不要重复自己的原则是没有害处的,只要该函数在每个与员工相关的测试中只包含最基本的共性,并且在每个测试中不记住状态,以确保测试之间的隔离。
例如,以下内容:
var expect = require('chai').expect;
var request = require('request');
var chai = require('chai')
, chaiHttp = require('chai-http');
chai.use(chaiHttp);
var should = chai.should();
const assertEmployeeAttrs = (res) => {
res.should.be.json;
res.body.forEach((item) => {
// common employee attributes
item.should.have.property("first_name");
item.should.have.property("last_name");
item.should.have.property("email");
})
};
describe('Employees', function() {
var url = 'http://localhost:3000';
it('Returns Employees', function(done) { // <= Pass in done callback
chai.request(url)
.get('/employees')
.end(function(err, res) {
// unique assertions per test i.e. res status codes, etc...
expect(res).to.have.status(200);
// common assertions across each employee test. i.e. base employee attributes
assertEmployeeAttrs(res);
done(); });
});
it('Add an Employee', function(done) { // <= Pass in done callback
chai.request(url)
.post('/employees')
.send({"first_name": "asdad", "last_name": "asdasd", "email": "asdasd@example.com"})
.end(function(err, res) {
// unique attributes
expect(res).to.have.status(201);
// common employee attributes
assertEmployeeAttrs(res);
global.idVariable = res.body.id;
done(); });
});
针对您的附加问题:如何将此Employee断言检查添加到一个单独的文件中,并从另一个文件调用它
方法如下:
- 将此Employee断言代码检查代码添加到另一个文件中
- 使用
module.exports
导出此新添加的功能 require
将此新代码放入任何需要使用此Employee Assertion检查的文件中,并使用与以前相同的代码
在代码中,这看起来如下:
employeeAssert.js(新文件(
var expect = require('chai').expect;
var request = require('request');
var chai = require('chai');
var chaiHttp = require('chai-http');
chai.use(chaiHttp);
var should = chai.should()
let employeeAssert = {};
employeeAssert.hasAttrs = (res) => {
res.should.be.json;
res.body.forEach((item) => {
// common employee attributes
item.should.have.property("first_name");
item.should.have.property("last_name");
item.should.have.property("email");
})
};
module.exports = employeeAssert;
使用员工断言检查的文件:
var expect = require('chai').expect;
var request = require('request');
var chai = require('chai');
var chaiHttp = require('chai-http');
// change path as appropriate, for now we assume the same parent dir
var employeeAssert = require('./employeeAssert);
chai.use(chaiHttp);
var should = chai.should();
describe('Employees', function() {
var url = 'http://localhost:3000';
it('Returns Employees', function(done) { // <= Pass in done callback
chai.request(url)
.get('/employees')
.end(function(err, res) {
expect(res).to.have.status(200);
employeeAssert.hasAttrs(res);
done();
});
});