Тестирование замыканий. Как проверить обратный вызов, переданный на закрытие Жасмин - PullRequest
0 голосов
/ 17 января 2020

Я работаю над проблемами закрытия в курсе на frontendmasters.com, который ведет Уилл Сентанс. Я изо всех сил пытаюсь проверить свою функциональность.

Эта функция after принимает количество вызовов, которые необходимо вызвать перед выполнением в качестве первого параметра, и обратного вызова в качестве второго параметра.

Вот мое решение.

function closures() {
  // more functions above...
  this.after = (r, cb) => {
    counter = 1;
    return () => { if (counter == r) cb() } ;
  };
}

Вот мои характеристики

describe("Closure", () => {
  beforeEach( () =>{
    closure = new closures();
  });

  describe('after', () => {
    beforeEach(() => {
      hello = () => console.log('hello');
      spyOn(console, 'log');
      runOnce = closure.after(3, hello);
    });

    it("executes callback after called first x times", () => {
      first = runOnce();
      second = runOnce();
      third = runOnce();
      expect(first).toEqual(undefined); //successfull
      expect(second).toEqual(undefined);  // successful
      expect(console.log).toHaveBeenCalledWith('hello');  // successful
      expect(console.log.calls.count()).toEqual(1);  // fails expected 0 to eq 1
    })
  });
}

Please advise how to test the callback is only invoked once.

1 Ответ

0 голосов
/ 21 января 2020

Вот решение для юнит-тестирования:

closures.js:

function closures() {
  this.after = (r, cb) => {
    counter = 1;
    return () => {
      if (counter == r) cb();
    };
  };
}

module.exports = closures;

closures.test.js:

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

fdescribe('Closure', () => {
  let closure;
  const hello = () => console.log('hello');

  beforeEach(() => {
    closure = new closures();
  });

  describe('after', () => {
    beforeEach(() => {
      spyOn(console, 'log');
    });

    it('executes callback after called first x times', () => {
      const runOnce = closure.after(1, hello);
      const first = runOnce();
      expect(first).toEqual(undefined);
      expect(console.log).toHaveBeenCalledWith('hello');
      expect(console.log.calls.count()).toEqual(1);
    });
    it('should not call calback if counter is not equal with r', () => {
      const runOnce = closure.after(2, hello);
      const first = runOnce();
      expect(first).toEqual(undefined);
      expect(console.log).not.toHaveBeenCalled();
    });
  });
});

Результаты юнит-теста с отчетом о покрытии:

HeadlessChrome 73.0.3683 (Mac OS X 10.13.6): Executed 2 of 5 (skipped 3) SUCCESS (0.04 secs / 0.004 secs)
TOTAL: 2 SUCCESS
TOTAL: 2 SUCCESS
TOTAL: 2 SUCCESS

src/stackoverflow/59790114 |      100 |      100 |      100 |      100 |                   |
  closures.js               |      100 |      100 |      100 |      100 |                   |
  closures.test.js          |      100 |      100 |      100 |      100 |                   |
...