Ich versuche Nock verwenden, um einige HTTP-Verkehr in meiner Anwendung zu Testzwecken abzufangen/zu verspotten. Unsere App authentifiziert sich auf einer unserer Websites und ich brauche Nock, um HTTP 200 (mit JSON-Daten) und HTTP 401 (ohne Daten) zu imitieren, um Verhaltensweisen zu testen, wenn der Benutzer dort angemeldet ist bzw. nicht eingeloggt ist. .Wie kann ich Nock und Mocha gut zusammen spielen lassen?
Ich habe zwei Tests, die beide korrekt funktionieren, wenn sie alleine ausgeführt werden, aber wenn ich die gesamte Testsuite ausführen, schlägt eine von ihnen immer fehl. Ich erkenne, dass Nock ist gemeinsamen Status, weil es ändert, wie node.js selbst behandelt Netzwerkverkehr und ich nehme an, dass das ist die Ursache der Race-Bedingung, aber ich kann nicht die einzige Person sein, die jemals zwei verschiedene Nock Interzeptoren für die gleiche Anfrage verwendet zwei verschiedene Tests, also weiß ich, dass mir etwas fehlt.
Kann mir jemand helfen herauszufinden, warum diese Tests aufeinander treten?
Meine Frage bezieht sich auf How to retest same URL using Mocha and Nock?, aber ich habe die Dinge dort vorgeschlagen und sie haben nicht geholfen.
Meine Testdateien (die wiederum beide gut funktionieren, wenn einzeln aufgerufen, aber nicht, wenn sie als Teil des gleichen Testdurchlauf ausgeführt wird) wie folgt aussehen:
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);
});
});
});
und
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;
});
});
});
Welchen Fehler sehen Sie, wenn Sie beide Tests zusammen ausführen? –
Ich bekomme keinen Fehler, es ist nur, dass der zweite Test fehlschlägt, wenn es passieren sollte. Es scheint, dass der zweite Test durch den Schein des ersten Tests beeinflusst wird. –