Мокка, Синон и Чай тестируют два http-звонка внутри обратного вызова - PullRequest
0 голосов
/ 26 мая 2018

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

index.js

const http = require('http')

class Index {
  add(a, b) {
    return a + b
  }

  get(uri) {
    http.get(uri, () => {
      http.get('/', function() {
        return
      })
    })
  }
}

module.exports = Index

index.spec.js

const Index = require('../index')
const http = require('http')
const { stub, fake, assert } = require('sinon')
const { expect } = require('chai')

let httpSpy;

beforeEach(function () {
  a = new Index()
  httpSpy = stub(http, 'get')
})

describe('When the get method is invoked', function () {
  beforeEach(function () {
    a.get('http://www.google.co.uk')
  })

  it('should make a call to the http service with passed in uri', function () {
    assert.calledOnce(httpSpy) // This really should be called twice (Part I am struggling with)
    assert.calledWith(httpSpy, 'http://www.google.co.uk')
    // I want to test instead that the httpSpy was called twice as, inside the get method, when the first http get resolves, another one gets fired off also
  })
})

1 Ответ

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

Существует две проблемы.

Во-первых, мы не можем сказать, когда завершено выполнение метода Index.get() (он не принимает обратный вызов, не возвращает обещание, не помеченное как асинхронное и т. Д.).

get(uri) { ... }

Использование такого метода критически неудобно.Например: если мы хотим сначала выполнить Index.get(), а затем выполнить какое-либо действие сразу после того, как мы не сможем.

Чтобы исправить это, мы можем просто добавить обратный вызов в качестве последнего параметраIndex.get.

Вторая проблема заключается в том, как заглушается метод http.get:

httpSpy = stub(http, 'get')

Эта строка в основном означает: замените http.get пустой функцией.Эта фиктивная функция не сработает, если вы передадите обратный вызов внутри , но не вызовет ее.

Именно поэтому http.get вызывается только один раз.Он просто игнорирует переданный обратный вызов, где http.get должен быть вызван во второй раз.

Чтобы исправить это, мы можем использовать метод stub.yields(), чтобы заставить sinon знать, что последний параметр, переданный заглушке, является обратным вызовом (иСинон должен это назвать).Вы можете найти метод в документах .

Вот рабочий пример, пожалуйста, смотрите мои комментарии:

class Index {
    // Added a callback here
    get(uri, callback) {
        http.get(uri, () => {
            http.get('/', () => {
                // Pass any data you want to return here
                callback(null, {});
            })
        })
    }
}

let httpSpy;

beforeEach(() => {
    a = new Index()
    // Now sinon will expect a callback as a last parameter and will call it
    httpSpy = stub(http, 'get').yields();
})

describe('When the get method is invoked', () => {
    const uri = 'http://www.google.co.uk';

    // Now we are waiting for the execution to end before any assertions
    beforeEach(done => {
        a.get(uri, done);
    });

    it('should make a call to the http service with passed in uri', () => {
        assert.calledTwice(httpSpy);
        assert.match(httpSpy.getCall(0).args[0], uri);
        assert.match(httpSpy.getCall(1).args[0], '/');
    });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...