Я не могу проверить свои паруса. js контроллер с chai и sinon - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть контроллер Учетные записи с методом sum и служебный файл с именем validation с объектом register . Этот объект имеет метод validate , который проверяет предоставленную форму и возвращает логическое значение.

Controller

sum: function(req, res) {

    //validate form with a validation service function
    const validator = new validation.register();
    let check = validator.validate(req.body.form);

    let count = 0;

    if (check) {
        count += 1;
    } else {
        count -= 1;
    }

    res.send(count);

},

test

//imports
const chai = require("chai");
const expect = chai.expect;
const sinon = require("sinon");
const util = require('util'); // to print complex objects
const acountsC = require("../../../api/controllers/AcountsController.js");

describe("AcountsController", function()  {
  describe("sum", function() {

    let req = {
        body: {
            form: {}
        }
    }

    let res = {
        send: sinon.spy()
    }

    let validation = {
        register: {
            validate: function() {}
        }
    }       

    let stub_validate = sinon.stub(validation.register, "validate").returns(true);


    it("count should be 1 when validation is true", function() {

        acountsC.sum(req, res);

        expect(count).to.equal(1);

    });


  });
});

журнал испытаний

AcountsController
    sum
      1) count should be 1 when validation is true


  0 passing (5s)
  1 failing

  1) AcountsController
       sum
         count should be 1 when validation is true:
     ReferenceError: count is not defined

примечание

Я понимаю, что тест должен выполнить фрагмент кода, который мы вызываем, заменив внешние функции, вызываемые в этом фрагменте кода (контроллер), возвращая все, что мы установили. Если тест выполняет этот фрагмент кода, почему я не могу получить доступ к переменным, созданным в контроллере?

Я попытался, отслеживая res.send (), и проверить, был ли он вызван с 1. У меня не получилось. Я везде искал, как выполнить утверждение для переменной, но ничего не нашел. : (

надеюсь, вы можете помочь

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вот решение для модульного тестирования:

accountController.js:

const validation = require('./validation');

class AccountController {
  sum(req, res) {
    const validator = new validation.register();
    const check = validator.validate(req.body.form);

    let count = 0;

    if (check) {
      count += 1;
    } else {
      count -= 1;
    }

    res.send(count);
  }
}

module.exports = AccountController;

validation.js:

class Register {
  validate() {}
}

module.exports = {
  register: Register,
};

accountController.test.js:

const AccountController = require('./accountController');
const sinon = require('sinon');
const validation = require('./validation');

describe('60182912', () => {
  afterEach(() => {
    sinon.restore();
  });
  describe('#sum', () => {
    it('should increase count and send', () => {
      const registerInstanceStub = {
        validate: sinon.stub().returns(true),
      };
      const registerStub = sinon.stub(validation, 'register').callsFake(() => registerInstanceStub);
      const accountController = new AccountController();
      const mRes = { send: sinon.stub() };
      const mReq = { body: { form: {} } };
      accountController.sum(mReq, mRes);
      sinon.assert.calledWithExactly(mRes.send, 1);
      sinon.assert.calledOnce(registerStub);
      sinon.assert.calledWithExactly(registerInstanceStub.validate, {});
    });

    it('should decrease count and send', () => {
      const registerInstanceStub = {
        validate: sinon.stub().returns(false),
      };
      const registerStub = sinon.stub(validation, 'register').callsFake(() => registerInstanceStub);
      const accountController = new AccountController();
      const mRes = { send: sinon.stub() };
      const mReq = { body: { form: {} } };
      accountController.sum(mReq, mRes);
      sinon.assert.calledWithExactly(mRes.send, -1);
      sinon.assert.calledOnce(registerStub);
      sinon.assert.calledWithExactly(registerInstanceStub.validate, {});
    });
  });
});

Результаты модульных испытаний с отчетом о покрытии:

  60182912
    #sum
      ✓ should increase count and send
      ✓ should decrease count and send


  2 passing (10ms)

----------------------|---------|----------|---------|---------|-------------------
File                  | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------------|---------|----------|---------|---------|-------------------
All files             |     100 |      100 |      50 |     100 |                   
 accountController.js |     100 |      100 |     100 |     100 |                   
 validation.js        |     100 |      100 |       0 |     100 |                   
----------------------|---------|----------|---------|---------|-------------------

исходный код: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60182912

0 голосов
/ 13 февраля 2020

Проблема была в файле жизненного цикла, который я создал, доверяя документам паруса. Эта документация предназначена для комплексного тестирования, поскольку она поднимает паруса перед любым другим тестом. Это довольно медленно, а юнит-тесты должны быть быстрыми. Стирание этого файла было достаточно для успешного тестирования контроллера. В противном случае паруса портятся с тестами так, что я даже не до конца их понимаю. Я предполагаю, что это из-за парусов, делающих услуги глобально доступными. Поэтому, когда мой контроллер вызывает службу проверки, этот возвращает некоторое значение по умолчанию, а не то, что заглушка говорит, что он должен вернуть.

ОБНОВЛЕНИЕ:
Мне удалось заставить его работать. При подъеме парусов перед испытанием должен требоваться только проверенный контроллер, а службы и модели - нет.

...