2011-11-05 47 views
33

Có cách nào thuận tiện để giả lập các đối tượng Yêu cầu và Trả lời HTTP cho các phần mềm kiểm tra đơn vị không?node.js: Yêu cầu và phản hồi http giả

+0

Có lý do nào khiến bạn không bao gồm các yêu cầu HTTP thực trong trường hợp kiểm tra của mình không? Nên reallx khả thi trong một thiết lập thử nghiệm async. –

+9

Tôi đã đi với điều đó, nhưng phải trung thực nó không cảm thấy giống như một bài kiểm tra đơn vị, nó giống như một trong những tích hợp. Dù sao, cho đến nay đó là lựa chọn tốt nhất của tôi. – 7elephant

+4

Tôi không muốn bao gồm các yêu cầu http thực vì nó làm cho các bài kiểm tra của tôi chậm hơn và ít đáng tin cậy hơn. Ví dụ, nếu một trong các dịch vụ tôi gọi là DB được hỗ trợ, và nó không thành công vì DB trong QA đã bị xóa sổ (hoặc đồng bộ hóa với sản phẩm, hoặc bất cứ điều gì) thì các thử nghiệm của tôi bắt đầu thất bại. Ngoài ra nếu bạn không giả lập nó gần như không thể tin cậy buộc các trường hợp lỗi nhất định xảy ra. Không, tôi thích mocks - họ làm cho thử nghiệm dễ dàng hơn và đáng tin cậy hơn. – Kevin

Trả lời

1

Tôi đang sử dụng nodejutsu giả:

https://github.com/nodejitsu/mock-request

Có lẽ đây là những gì bạn đang tìm kiếm.

+4

Dự án không được chấp nhận. Đề nghị là sử dụng "nock" https://github.com/flatiron/nock –

+3

nock không hoạt động để khôi phục các yêu cầu http. – Kevin

1

tôi đã viết một thư viện để thử ra các câu trả lời các yêu cầu thực hiện thông qua HTTP tiêu chuẩn hoặc thông qua các mô hình yêu cầu:

https://github.com/ctide/fakeweb

24

Dường như cả hai https://github.com/howardabrams/node-mocks-httphttps://github.com/vojtajina/node-mocks có thể được sử dụng để tạo mô hình http.ServerRequesthttp.ServerResponse các đối tượng.

+1

node-mocks-http trông giống như một giải pháp tuyệt vời cho bài đăng gốc. – newz2000

+0

Ok, chỉ cần đi qua điều này, nút-mocks-http là tuyệt vời. (Theo như trình xử lý yêu cầu thử nghiệm mà không thực sự yêu cầu http) –

7

Từ thẻ, có vẻ như câu hỏi này là về Express. Trong trường hợp đó, supertest là rất tốt:

var request = require('supertest') 
    , express = require('express'); 

var app = express(); 

app.get('/user', function(req, res){ 
    res.send(201, { name: 'tobi' }); 
}); 

request(app) 
    .get('/user') 
    .expect('Content-Type', /json/) 
    .expect('Content-Length', '20') 
    .expect(201) 
    .end(function(err, res){ 
    if (err) throw err; 
    }); 

Để sử dụng Node chung, Flatiron Nock trông giống như một lựa chọn tốt:

var nock = require('nock'); 
var example = nock('http://example.com') 
       .get('/foo') 
       .reply(200, { foo: 'bar' }); 

var http = require('http'); 
var options = { 
    host: 'example.com', 
    port: 80, 
    path: '/foo', 
    method: 'GET' 
} 
var req = http.request(options, function(res) { 
    res.on('data', function(chunk) { 
    console.log('BODY: ' + chunk); 
    }); 
}); 

req.on('error', function(e) { 
    console.log('error: ' + e); 
}); 

req.end(); 

Output:

BODY: { "foo": "thanh "}

+0

+1 cho nock, công cụ rất hữu ích. – undefined

+1

Đây là một bài đăng cũ. Nhưng tôi có một câu hỏi. supertest, trong đó có 'yêu cầu (app)', dường như để bắt đầu một máy chủ (https://github.com/tj/supertest/blob/master/index.js#L20), và nó không phải là giả mạo http reqeusts. Điều đó có đúng không? – NullSpace

0

Mockery có vẻ tuyệt vời cho việc này.

Về cơ bản nó chiếm đoạt các cuộc gọi require và trả về một đối tượng/hàm khác mà bạn chỉ định.

0

Tôi khuyến khích bạn sử dụng motty. tại sao chúng ta cần một mã khác?

Các vấn đề liên quan