Попытка прервать HTTP-вызов с помощью Mocha & Sinon. Полученная ошибка: TypeError: ожидается, что уступит, но обратный вызов не был передан

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

Я создал приложение Axios для получения всех todos & экспортируется как заглушка:

      const axios = require('axios');

const getAllTodos = () => {
  return axios.get('https://jsonplaceholder.typicode.com/todos').then(response => response);
};

module.exports = { getAllTodos };

Затем я попытался заглушить его вот так:

      const { expect } = require('chai');
const sinon = require('sinon');
const axios = require('axios');

const { getAllTodos } = require('correct/path/to/method');

describe('Testing the todos HTTP call', () => {
  before(() => {
      sinon.stub(axios, 'get').yields(null, null, JSON.stringify([
        {
          userId: 1,
          id: 1,
          title: "delectus aut autem",
          completed: false
          },
      ]))
    });

    after(() => {
      axios.get.restore();
    });

  it('should return all todos', done => {
    getAllTodos().then(todos => {
      todos.data.forEach(todo => {
        expect(todo).to.have.property('userId');
        expect(todo).to.have.property('id');
        expect(todo).to.have.property('title');
        expect(todo).to.have.property('completed');
      });
      done();
    }).catch(done, done);
  });
});

Однако я получаю следующую ошибку:

      1) Testing the todos HTTP call
       should return all todos:
     TypeError: get expected to yield, but no callback was passed. Received [https://jsonplaceholder.typicode.com/todos]

Если я тестирую модуль, не заглушая его. Работает как часы. Это модульный тест без заглушки:

      const { expect } = require('chai');
const { getAllTodos } = require('correct/path/to/method');

describe('Testing the todos HTTP call', () => {
  it('should return all todos', done => {
    getAllTodos().then(todos => {
      todos.data.forEach(todo => {
        expect(todo).to.have.property('userId');
        expect(todo).to.have.property('id');
        expect(todo).to.have.property('title');
        expect(todo).to.have.property('completed');
      });
      done();
    }).catch(done, done);
  });
});

Я правильно прохожу с правильными утверждениями:

      
Testing the todos HTTP call
    ✓ should return all todos (169ms)

Как я могу это исправить? Что я делаю не так? Мне нужно понятное для новичков объяснение, чтобы перевести это решение в мою собственную реализацию.

РЕДАКТИРОВАТЬ:

Я пробовал другие способы заглушить HTTP звоните, он работает с Интернетом, но как только я закрыл свой Интернет ... stubтерпит неудачу. Это мой последний код:

      describe('Testing the todos HTTP call', () => {
  let stub;

  beforeEach(() => {
    stub = sinon.stub({ getAllTodos }, 'getAllTodos');
  });

  afterEach(() => {
    stub.restore();
  });

  it('should return all todos with the right properties', () => {
    const mockedResponseObj = {
      userId: 1,
      id: 1,
      title: 'This is title',
      completed: true,
    };

    stub
      .withArgs('https://jsonplaceholder.typicode.com/todos')
      .returns(Promise.resolve(mockedResponseObj));

    const result = getAllTodos('https://jsonplaceholder.typicode.com/todos');

    expect(result.data[0]).to.have.property('userId');
    expect(result.data[0]).to.have.property('id');
    expect(result.data[0]).to.have.property('title');
    expect(result.data[0]).to.have.property('completed');
  });
});

и экспортированный function последний код:

      const axios = require('axios');

const getAllTodos = url => {
  return axios.get(url).then(response => response);
};

module.exports = { getAllTodos };

1 ответ

Решение

Я смог провести единичное тестирование getALLTodos метод заглушки Axios & это GET метод вместо этого:

      describe('Testing the todos HTTP call', () => {
  let stub;

  const mockedResponseObj = {
    userId: 1,
    id: 1,
    title: 'This is title',
    completed: true,
  };

  beforeEach(() => {
    stub = sinon.stub(axios, 'get').resolves(mockedResponseObj);
  });

  afterEach(() => {
    stub.restore();
  });

  it('should return all todos with the right properties', done => {
    getAllTodos('https://jsonplaceholder.typicode.com/todos').then(res => {
      expect(res.data[0]).to.have.keys(Object.keys(mockedResponseObj));
    });
    done();
  });
});
Другие вопросы по тегам