Ложная ошибка мангуста save () внутри маршрута - PullRequest
0 голосов
/ 23 мая 2018

Попробовав все способы проверить бросок мангуста save(), я не совсем понял, как это сделать.Я стремлюсь к 100% охвату istanbul.Вот основные настройки:

model.js

let mongoose = require('mongoose');
let Schema = mongoose.Schema;

let PasteSchema = new Schema(
  {
    message: { type: String, required: true },
    tags: [String],
    marked: { type: Boolean, default: false },
    createdAt: { type: Date, default: Date.now },
    updatedAt: Date
  }
);

module.exports = mongoose.model('paste', PasteSchema);

controller.js

let Paste = require('./model');

// Other stuff

// I use a bit non-standard DELETE /pastes/:id for this
const markPaste = (req, res) => {
  Paste.findById({ _id: req.params.id }, (err, paste) => {
    if (!paste) {
      res.status(404).json({ result: 'Paste not found' });
      return;
    }
    paste.marked = true;
    paste.updatedAt = new Date();
    paste.save((err) => {
      err
        ? res.status(400).json({ result: err })
        : res.json({ result: 'Paste marked' });
    });
  });
}

module.exports = {
  markPaste,
  // Other stuff
}

rout.js

const express = require('express');
const app = express();
const pastes = require('./apps/pastes/controller'); // The file above

app.route('/pastes/:id')
  .delete(pastes.markPaste);

module.exports = app;

В приведенном нижеtest, я хочу смоделировать ошибку, выдаваемую в paste.save((err) => { выше.

process.env.NODE_ENV = 'test';

let mongoose = require('mongoose');
let Paste = require('../apps/pastes/model');
let server = require('../index');

let chai = require('chai');
chai.use(require('chai-http'));
chai.use(require('chai-date-string'));
let expect = chai.expect;
let sinon = require('sinon');
let sandbox = sinon.createSandbox();
let pastes = require('../apps/pastes/controller');
let httpMocks = require('node-mocks-http');

// Other tests

Затем тест, который я хочу проверить save() error в маршруте:

it('should handle an error during the save in the endpoint', (done) => {
  // Create a paste to be deleted
  const pasteItem = new Paste({ message: 'Test 1', tags: ['integration', 'test'] });
  pasteItem.save()
    .then((paste) => {
      // Attempt code from below goes here
    })
    .catch((err) => {
      console.log('Should not go here');
    });
  done();
});

1 Ответ

0 голосов
/ 23 мая 2018

Я не нашел четкой ссылки на это в различных вопросах стека или в Интернете, поэтому вот как я это сделал:

Секрет в использовании песочницы sinon, которая применяется даже внутриконтекст маршрута во время тестов.Вот рабочий тест:

it('should handle an error during the save in the endpoint', (done) => {
  const pasteItem = new Paste({ message: 'Test 1', tags: ['integration', 'test'] });
  pasteItem.save()
    .then((paste) => {
      // the sandbox is defined in the imports
      // This forces calling save() to raise an error
      sandbox.stub(mongoose.Model.prototype, 'save').yields({ error: 'MongoError' });
      chai.request(server)
        .delete('/pastes/' + paste._id)
        .end((err, res) => {
          // It applies within the route handling, so we get the expected 400
          expect(res).to.have.status(400);
          done();
        });
    })
    .catch((err) => {
      console.log('Should not go here');
    });
});

Если вы вызовете его вне песочницы, вы прервете все последующие тесты, использующие sinon.Т.е.

// This would break things unintendedly
sinon.stub(mongoose.Model.prototype, 'save').yields({ error: 'MongoError' });

// This only breaks things (on purpose) in the test we want it to break in:
sandbox.stub(mongoose.Model.prototype, 'save').yields({ error: 'MongoError' });

Если у вас есть несколько вещей в конкретном экземпляре sandbox, вы, конечно, можете восстановить состояние «непрерывности» в тесте с помощью sandbox.restore(); после теста.

->

=============================== Coverage summary ===============================
Statements   : 100% ( 60/60 )
Branches     : 100% ( 14/14 )
Functions    : 100% ( 0/0 )
Lines        : 100% ( 57/57 )
================================================================================

Ууу!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...