Попытка прервать 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();
});
});