Tôi đã không gặp khó khăn khi kiểm tra trình xử lý tuyến đường của riêng tôi nhưng trong trường hợp này tôi muốn thử nghiệm trình xử lý tĩnh của express. Tôi không thể cho cuộc sống của tôi tìm ra lý do tại sao nó treo. Rõ ràng có một số gọi lại tôi đang thiếu hoặc một số sự kiện tôi cần phải phát ra.Làm thế nào để giả http.ServerResponse và http.IncomingMessage cho express.static
Tôi đã cố tạo ví dụ nhỏ nhất có thể.
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
nó chỉ lần ra ngoài.
Tôi đang thiếu gì?
Tôi cũng đã thử thực hiện yêu cầu một luồng có thể đọc được. Không thay đổi
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();
}
});
});
Tôi vẫn đang đào. Nhìn vào bên trong máy chủ tĩnh Tôi thấy nó tạo ra một dòng có thể đọc được bằng cách gọi fs.createReadStream
. Nó thực hiện một cách hiệu quả
var s = fs.createReadStream(filename);
s.pipe(res);
Vì vậy, cố gắng mà bản thân mình làm việc tốt
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();
}
});
Tôi nghĩ có lẽ đó là một cái gì đó về nhanh chờ đợi cho các dòng đầu vào để kết thúc nhưng điều đó dường như không thể là một trong hai. Nếu tôi tiêu thụ các dòng đầu vào giả với câu trả lời nó làm việc tốt
it('test msg->res', function(done) {
var req = new MockMessage({});
var res = new MockResponse(responseDone);
req.pipe(res);
function responseDone() {
console.log("done");
done();
}
});
Bất kỳ cái nhìn sâu sắc những gì tôi có thể bị mất sẽ là hữu ích
Lưu ý: trong khi gợi ý cho các thư viện chế giễu bên thứ 3 được đánh giá cao tôi vẫn thực sự tìm hiểu những gì tôi đang thiếu để tự mình làm. Ngay cả khi tôi cuối cùng chuyển sang một số thư viện, tôi vẫn muốn biết tại sao điều này không hiệu quả.
Tôi đoán đó là 'trước' chạy không đồng bộ. Có thể thử sử dụng gọi lại để đợi nó hoàn thành? – brandonscript
Nó không phải là 'trước' chạy async. Phần đó hoàn thành tốt – gman