2014-07-03 30 views
9

Đang sử dụng Mocha, Chai, Sinon, Proxyquire và Nock.Cách kiểm tra lại cùng một URL bằng cách sử dụng Mocha và Nock?

Đối với trường hợp thử nghiệm cụ thể này (mà câu hỏi này đang được hỏi), muốn kiểm tra cùng một URL chính xác nhiều lần, mỗi lần trong một thử nghiệm riêng biệt kỳ vọng một phản hồi khác.

Ví dụ: phản hồi không có nguồn cấp dữ liệu người bán, 1 nguồn cấp dữ liệu người bán và một lần nữa với 2 nguồn cấp dữ liệu người bán.

Mã hiện tại tất cả đều hoạt động, hơn nữa nếu tôi chạy thử nghiệm riêng lẻ, chúng vượt qua.

Tuy nhiên, nếu tôi chạy chúng cùng nhau bằng cách sử dụng Mocha trong một bộ duy nhất họ không thành công. Tin rằng vấn đề là Nock chiếm đoạt đối tượng http toàn cầu cho một URL đã cho và mỗi thử nghiệm (chạy không đồng bộ cùng một lúc) đang cạnh tranh cho cùng một tham chiếu phản hồi toàn cầu.

Trong trường hợp trên, một câu trả lời chuẩn bị với một câu trả lời đóng hộp của 1 thương gia đang bị nói ghi đè bởi các thiết lập để đáp ứng với 2 thương gia, vv

Có một cơ chế để tránh điều này xảy ra, ví dụ đảm bảo xung quanh thực thi nối tiếp các testcase Mocha không đồng bộ (mà tôi tin là hành vi mặc định).

Trả lời

7

Ok, vì vậy công trình này (mẫu mã):

beforeEach(function (done) { 
      nock(apiUrl) 
       .get('/dfm/api/v1/feeds?all=false') 
       .reply(200, [ 
        {'merchantId': 2, 'id': 2, 'disabled': false} 
       ], { server: 'Apache-Coyote/1.1', 
        'set-cookie': [ 'JSESSIONID=513B77F04A3A3FCA7B0AE1E99B57F237; Path=/dfm/; HttpOnly' ], 
        'content-type': 'application/json;charset=UTF-8', 
        'transfer-encoding': 'chunked', 
        date: 'Thu, 03 Jul 2014 08:46:53 GMT' }); 

      batchProcess = proxyquire('./batchProcess', { 
       './errorHandler': errorHandler.stub, 
       './batchTask': batchTask.stub 
      }); 

      winston.info('single valid feed beforeEach completed'); 
      done(); 
    }); 

Có rất nhiều yếu tố phức tạp. Hai điều cần lưu ý:

1). Tôi đã testcase async nhưng đã sử dụng beforeEach() mà không có param thực hiện. Điều này sau đó gây ra các xung đột URL. Bằng cách khai báo từng beforeEach (xong) và gọi xong() Mocha sẽ chạy theo thứ tự nối tiếp và không còn là vấn đề nữa.

2). Hãy chắc chắn rằng nếu bạn có nhiều hơn một bài kiểm tra trong cùng một tệp testsuite, mọi đồ thị Nock mà bạn đặt trong một bài kiểm tra trước đó thực sự được thực hiện NẾU bạn đã khai báo cùng một URL trong bài kiểm tra tiếp theo với câu trả lời thay thế. Nếu trận đấu nock trước đó không được gọi thì Nock STILL giữ lại phản hồi từ bài kiểm tra sai (bài kiểm tra trước). Đây là vấn đề chính của tôi. Bạn có thể tranh luận rằng các xét nghiệm không nên có bất kỳ đồ đạc nào được tuyên bố nếu chúng không chạy - nhưng bạn cũng có thể tranh luận rằng đây vẫn là một lỗi theo cách mà Nock làm việc. Các đồ đạc thử nghiệm từng được phân lập trong mô tả của riêng mình/các chức năng beforeEach (thực hiện) ..

Cập nhật 2 ngày sau ... OK điểm 2). chỉ cần bit tôi một lần nữa, và tôi đã hài lòng tôi đã viết lưu ý ở trên để nhắc nhở bản thân mình về vấn đề này khó khăn để gỡ lỗi. Nếu bạn đang sử dụng Mocha và Nock cùng nhau nhận thức được vấn đề này !!

cuối cùng đã thực hiện một chức năng Nock helper quá, để hỗ trợ này (coffeescript đây):

global.resetNock = -> 
    global.nock.cleanAll() 
    global.nock.disableNetConnect() 

Sau đó, vào lúc bắt đầu beforeEach chỉ áp dụng resetNock()

+0

Xin chào @arcseldon Xin chúc mừng bạn đã tìm thấy câu trả lời cho vấn đề này. Tôi đang ở trong tình huống tương tự https://stackoverflow.com/questions/46801001/nock-not-working-for-multiple-tests-running-together và sẽ yêu sự giúp đỡ của bạn nếu có thể. – Rash

8

Để đối phó với quan điểm của bạn 2), bạn có thể sử dụng nock.cleanAll() để dọn dẹp tất cả nocks chuẩn bị:

https://github.com/pgte/nock#cleanall

bạn có thể đặt này trong một khối afterEach để đảm bảo bạn không còn sót lại giữa các lần kiểm tra.

afterEach -> 
    nock.cleanAll() 
+0

Cảm ơn James, đã làm điều đó, vui lòng xem câu trả lời cập nhật. – arcseldon

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