Является ли хорошей идеей сохранить эти общие утверждения в отдельном файле и не повторять их?

1

Это хорошая идея сохранить эти общие утверждения в отдельном файле, а не повторять его? Я написал так, так как это формат 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": "[email protected]"})
       .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");
           })
Теги:
mocha
chai

1 ответ

1
Лучший ответ

Может быть, вы можете просто включить эти общие утверждения, связанные с Сотрудниками, в функцию? Затем вызовите эту функцию EmployeeAssertion на каждой тестовой основе для каждого теста, который должен подтвердить ответ Employee для проверки общих атрибутов сотрудников. Я не знаю, что имеет смысл отделить эту проверку на подтверждение в другом файле, если в нескольких тестовых файлах не требуется функция проверки утверждения сотрудника. Главное помнить, что каждый из ваших индивидуальных тестов должен проверять одну вещь и должен быть изолирован друг от друга. Нет никакого вреда в создании общей функции утверждения для реализации (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": "[email protected]"})
       .end(function(err, res) {
       // unique attributes 
       expect(res).to.have.status(201);
       // common employee attributes  
       assertEmployeeAttrs(res);
       global.idVariable = res.body.id;
       done(); });
});

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

Подход заключается в следующем:

  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(); 
     });
 });    
  • 0
    Как я могу сохранить это общее утверждение в другом файле и вызвать его здесь?
  • 0
    Как я могу сохранить это общее утверждение в другом файле и вызвать его здесь?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню