Nie miałem problemów z testowaniem własnych procedur obsługi tras, ale w tym przypadku chcę przetestować obsługę statyczną Express. Nie mogę dla mojego życia dowiedzieć się, dlaczego to wisi. Najwyraźniej brakuje jakiegoś wywołania zwrotnego lub jakiegoś zdarzenia, które muszę emitować.Jak wyśmiać http.ServerResponse i http.IncomingMessage dla express.static
Próbowałem zrobić najmniejszy przykład, jaki mogłem.
var events = require('events');
var express = require('express');
var stream = require('stream');
var util = require('util');
function MockResponse(callback) {
stream.Writable.call(this);
this.headers = {};
this.statusCode = -1;
this.body = undefined;
this.setHeader = function(key, value) {
this.headers[key] = value;
}.bind(this);
this.on('finish', function() {
console.log("finished response");
callback();
});
};
util.inherits(MockResponse, stream.Writable);
MockResponse.prototype._write = function(chunk, encoding, done) {
if (this.body === undefined) {
this.body = "";
}
this.body += chunk.toString(encoding !== 'buffer' ? encoding : undefined);
done();
};
function createRequest(req) {
var emitter = new events.EventEmitter();
req.on = emitter.on.bind(emitter);
req.once = emitter.once.bind(emitter);
req.addListener = emitter.addListener.bind(emitter);
req.emit = emitter.emit.bind(emitter);
return req;
};
describe('test', function() {
var app;
before(function() {
app = express();
app.use(express.static(__dirname));
});
it('gets test.js', function(done) {
var req = createRequest({
url: "http://foo.com/test.js",
method: 'GET',
headers: {
},
});
var res = new MockResponse(responseDone);
app(req, res);
function responseDone() {
console.log("done");
done();
}
});
});
Setup
mkdir foo
cd foo
mkdir test
cat > test/test.js # copy and paste code above
^D
npm install express
npm install mocha
node node_modules/mocha/bin/mocha --recursive
to po prostu czasy zewnątrz.
Czego mi brakuje?
Próbowałem również uczynić żądanie strumieniem czytelnym. Bez zmian
var events = require('events');
var express = require('express');
var stream = require('stream');
var util = require('util');
function MockResponse(callback) {
stream.Writable.call(this);
this.headers = {};
this.statusCode = -1;
this.body = undefined;
this.setHeader = function(key, value) {
this.headers[key] = value;
}.bind(this);
this.on('finish', function() {
console.log("finished response");
callback();
});
};
util.inherits(MockResponse, stream.Writable);
MockResponse.prototype._write = function(chunk, encoding, done) {
if (this.body === undefined) {
this.body = "";
}
this.body += chunk.toString(encoding !== 'buffer' ? encoding : undefined);
done();
};
function MockMessage(req) {
stream.Readable.call(this);
var self = this;
Object.keys(req).forEach(function(key) {
self[key] = req[key];
});
}
util.inherits(MockMessage, stream.Readable);
MockMessage.prototype._read = function() {
this.push(null);
};
describe('test', function() {
var app;
before(function() {
app = express();
app.use(express.static(__dirname));
});
it('gets test.js', function(done) {
var req = new MockMessage({
url: "http://foo.com/test.js",
method: 'GET',
headers: {
},
});
var res = new MockResponse(responseDone);
app(req, res);
function responseDone() {
console.log("done");
done();
}
});
});
Wciąż kopałem. Zajrzyj do statycznego serwera, widzę, że tworzy czytelny strumień, dzwoniąc pod numer fs.createReadStream
. Czyni skutecznie
var s = fs.createReadStream(filename);
s.pipe(res);
Więc staramy się, że działa dobrze
it('test stream', function(done) {
var s = fs.createReadStream(__dirname + "/test.js");
var res = new MockResponse(responseDone);
s.pipe(res);
function responseDone() {
console.log("done");
done();
}
});
Myślałem, że może to jest coś, o wyraźnej czeka na strumieniu wejściowym do końca, ale to nie wydaje się być albo. Gdybym zużywają makiety strumień wejściowy z odpowiedzią to działa dobrze
it('test msg->res', function(done) {
var req = new MockMessage({});
var res = new MockResponse(responseDone);
req.pipe(res);
function responseDone() {
console.log("done");
done();
}
});
Każdy wgląd co I może być brakuje byłoby pomocne
Uwaga: podczas propozycje 3rd party bibliotek drwiących są doceniane nadal jestem Naprawdę chcę zrozumieć, czego mi brakuje, aby samemu to zrobić. Nawet jeśli w końcu przejdę do jakiejś biblioteki, nadal chcę wiedzieć, dlaczego to nie działa.
Domyślam się, że to "przed" działa asynchronicznie. Może spróbuj użyć wywołania zwrotnego, aby poczekać na zakończenie? – brandonscript
Nie jest to "przed" asynchroniczne. Ta część kończy się dobrze – gman