Является ли хорошей идеей сохранить эти общие утверждения в отдельном файле и не повторять их? - PullRequest
0 голосов
/ 30 октября 2018

Является ли хорошей идеей сохранить эти общие утверждения в отдельном файле и не повторять их? Я написал таким образом, так как это формат 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");
           })

1 Ответ

0 голосов
/ 30 октября 2018

Может быть, вы могли бы просто обернуть эти общие утверждения, связанные с сотрудниками, в функцию? Затем вызывать эту функцию EmployeeAssertion для каждого теста для каждого теста, который должен утверждать ответ сотрудника для проверки общего сотрудника. атрибутов . Я не знаю, имеет ли смысл разделять эту проверку утверждений на другой файл, если только функция проверки утверждений сотрудника не требуется в нескольких тестовых файлах. Главное, что нужно помнить: каждый из ваших отдельных модульных тестов должен проверять одну вещь и быть изолированным друг от друга. Нет ничего плохого в создании функции общего утверждения для реализации * 1007. * (СУХОЙ) не повторяйте принцип , если эта функция содержит только минимум общностей для каждого теста, связанного с сотрудником, и состояние не запоминается в каждом тесте для обеспечения изоляции через тесты.

Например, что-то вроде следующего:

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(); });
});

В ответ на ваш дополнительный вопрос: Как добавить эту проверку подтверждения сотрудника в отдельный файл и вызвать ее из другого файла?

Подход следующий:

  1. Добавьте этот код проверки кода подтверждения сотрудника в другой файл.
  2. Экспортируйте эту недавно добавленную функциональность с module.exports.
  3. require этот новый код в любом файле, который должен использовать эту проверку подтверждения сотрудника и использовать так же, как и раньше.

В коде это выглядит следующим образом:

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(); 
     });
 });    
...