Я пытаюсь использовать нок для перехвата/издевки некоторого HTTP-трафика в моем приложении для целей тестирования. Наше приложение проверяет подлинность на одном из наших сайтов, и мне нужен нок для имитации HTTP 200 (с данными JSON) и HTTP 401 (без данных) для проверки поведения, когда пользователь находится или не зарегистрирован там (соответственно) ,Как сделать Nock и Mocha хорошо вместе?
У меня есть два теста, которые работают правильно, когда запускаются в одиночку, но если я запускаю весь набор тестов, один из них всегда терпит неудачу. Я понимаю, что nock - это общее состояние, потому что оно изменяет, как node.js сам обрабатывает сетевой трафик, и я предполагаю, что это является причиной состояния гонки, но я не могу быть единственным человеком, который когда-либо использовал два разных перехватчика нока для одного и того же запроса в два разных теста, поэтому я знаю, что чего-то не хватает.
Может ли кто-нибудь помочь мне разобраться, почему эти тесты наступают друг на друга?
Мой вопрос связан с How to retest same URL using Mocha and Nock?, но я сделал то, что предложил там, и они не помогли.
Мои тестовые файлы (которые, опять же, как работать хорошо, если вызывать по отдельности, но не при запуске в рамках одного и того же тестового прохода) выглядит следующим образом:
import { expect } from 'chai';
import nock from 'nock';
import * as actionTypes from '../../src/constants/action-types';
import * as panoptes from '../../src/services/panoptes';
import { user } from '../modules/users/test-data';
const stagingHost = 'https://my-staging-server.org';
describe('Panoptes',() => {
afterEach(function (done) {
nock.cleanAll();
nock.disableNetConnect();
done();
});
beforeEach(function (done) {
nock.cleanAll();
nock.disableNetConnect();
done();
});
describe('with a valid user', function (done) {
let lastAction = null;
const scope = nock(stagingHost)
.get(/^\/oauth\/authorize/)
.reply(302, '', {
'location': 'https://localhost:3000',
'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
'X-Frame-Options': 'SAMEORIGIN',
'X-XSS-Protection': '1; mode=block',
});
scope
.get(/^\/api\/me/)
.reply(200, {
users: [user],
});
panoptes.checkLoginUser((action) => { lastAction = action; }).then(() => {
nock.removeInterceptor(scope);
done();
});
it('should know when somebody is logged in', function() {
expect(lastAction).to.not.be.null;
expect(lastAction.type).to.equal(actionTypes.SET_LOGIN_USER);
expect(lastAction.user).to.not.be.null;
expect(lastAction.user.id).to.equal(user.id);
expect(lastAction.user.login).to.equal(user.login);
});
});
});
и
import { expect } from 'chai';
import nock from 'nock';
import * as actionTypes from '../../src/constants/action-types';
import * as panoptes from '../../src/services/panoptes';
const stagingHost = 'https://my-staging-server.org';
describe('Panoptes',() => {
afterEach(function (done) {
nock.cleanAll();
nock.disableNetConnect();
done();
});
beforeEach(function (done) {
nock.cleanAll();
nock.disableNetConnect();
done();
});
describe('with no user', function (done) {
let lastAction = null;
const scope = nock(stagingHost)
.get(/^\/oauth\/authorize/)
.reply(302, '', {
'Cache-Control': 'no-cache',
'location': 'https://my-staging-server.org/users/sign_in',
'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
'X-Frame-Options': 'SAMEORIGIN',
'X-XSS-Protection': '1; mode=block',
});
scope
.get(/^\/api\/me/)
.reply(401);
panoptes.checkLoginUser((action) => { lastAction = action; }).then(() => {
nock.removeInterceptor(scope);
done();
});
it('should know that nobody is logged in', function() {
expect(lastAction).to.not.be.null;
expect(lastAction.type).to.equal(actionTypes.SET_LOGIN_USER);
expect(lastAction.user).to.be.null;
});
});
});
Какую ошибку вы видите при совместном тестировании обоих тестов? –
У меня нет ошибки, на самом деле, это просто, что второй тест терпит неудачу, когда он пройдет. Похоже, что на второе испытание влияет макет из первого теста. –