2016-12-27 4 views
0

Попытка написать тест для вложенной модели, но не может получить его работу:Мокко Тестирование Вложенные модели

Модель:

const EmployeeSchema = new mongoose.Schema({ 
    firstName: {type: String, required: true}, 
    lastName: { type: String, required: true} 
}); 

const CompanySchema = new mongoose.Schema({ 
    name: { type: String, required: true }, 
    streetAddress: { type: String, required: true }, 
    country: { type: String, required: true }, 
    employees:[EmployeeSchema]  
}, { timestamps: true}); 

Контроллер:

function create(req, res, next) { 
    const company = new Company({ 
    name: req.body.name, 
    streetAddress: req.body.streetAddress, 
    country: req.body.country  
    }); 

    company.employees.push(req.employees); 

    company.save() 
    .then(savedCompany => res.json(savedCompany)) 
    .catch(e => next(e)); 
} 

Тест:

describe('## Company APIs',() => { 
     let company = { 
     name: "Test Company", 
     streetAddress: "123 Fake Street", 
     country: "A Country"  
     }; 
     company.employees.push({firstName: "Jane", lastName: "Doe"}); 

    describe('# POST /api/company',() => { 
    it('should create a new company', (done) => { 
     request(app) 
     .post('/api/company') 
     .send(company) 
     .expect(httpStatus.OK) 
     .then((res) => { 
      expect(res.body.name).to.equal(company.name); 
      expect(res.body.streetAddress).to.equal(company.streetAddress); 
      expect(res.body.country).to.equal(company.country); 
      company = res.body; 
      done(); 
     }) 
     .catch(done); 
    }); 
    }); 

Приведенное выше дает: ТипError: Не удается прочитать свойство «push» undefined

Я пробовал еще несколько вещей, но это самый многообещающий результат, по какой-то причине я просто не могу заполнить встроенную модель как часть настройки до единичного теста.

+0

Это не может быть ответом, но я заметил, что эта строка 'company.employees. push ({firstName: "Jane", lastName: "Doe"}); 'в тесте. Он пытается вытолкнуть объект «сотрудники», которого нет в компании. И он не утверждает 'company.employees', тогда я думаю, вы можете удалить эту строку – PunNeng

ответ

0

В итоге я решил это, надеюсь, это поможет кому-то в будущем.

Тест:

it('should associate an employee with the company', (done) => {  
     var employee = new Employee(); 
     company.employees.push(employee);  
     request(app) 
     .put(`/api/company/${company._id}`) 
     .send(company) 
     .expect(httpStatus.OK) 
     .then((res) => { 
      expect(res.body.employees).to.be.an('array') 
      expect(res.body.employees).to.contain(employee.id) 
      done(); 
     }) 
     .catch(done); 
    }); 

Контроллер: Добавление этого обрабатывать несколько дополнений:

if (req.body.employees != null) {  
    req.body.employees.forEach(function(employee) {  
     company.employees.push(employee); 
    }, this); 
    }