2016-11-30 1 views
0

Nock 도구를 이해하려고 시도하고 있는데, 내 코드에서 요청 및 응답을 조롱합니다. 저는 간단한 HTTP 클라이언트 인 npm request를 사용하여 백엔드 REST API를 요청하고 Chai는 기대 라이브러리를, Mocha는 테스트를 실행합니다. 여기Nock으로 NodeJS 요청 및 응답을 조롱하십시오.

var nock = require('nock'); 
var storyController = require('../modules/storyController'); 

var getIssueResponse = { 
    //JSON object that we expect from the API response. 
} 

it('It should get the issue JSON response', function(done) { 
    nock('https://username.atlassian.net') 
    .get('/rest/api/latest/issue/AL-6') 
    .reply(200, getIssueResponse); 

    storyController.getStoryStatus("AL-6", function(error, issueResponse) { 
    var jsonResponse = JSON.parse(issueResponse); 

    expect(jsonResponse).to.be.a('object'); 
    done(); 
}) 
}); 

그리고 GET 요청을 할 수있는 코드는 다음과 같습니다 : 여기가 테스트를 위해 가지고있는 코드는이 단일 테스트가 통과되고 난 왜 이해가 안

function getStoryStatus(storyTicketNumber, callback) { 
    https.get('https://username.atlassian.net/rest/api/latest/issue/' + storyTicketNumber, function (res) { 

    res.on('data', function(data) { 
    callback(null, data.toString()); 
    }); 

    res.on('error', function(error) { 
    callback(error); 
    }); 
    }) 
} 

. 실제로 실제 전화를 걸고 내 가짜 노크 요청/응답을 사용하지 않는 것 같습니다. 나는 장전 섹션 또는 변경 언급 경우

.reply(200, getIssueResponse) to .reply(404) 

그것은 테스트 아무것도 변화를 중단하지 않습니다, 나는 나의 장전 변수로 아무것도 아니에요. 누군가 Nock을 사용하여 NodeJS http-client에서 요청과 응답을 조롱하는 방법을 명확하게 보여주는 설명을 해줄 수 있습니까?

+0

응답 엔드 콜백은 어디에 있습니까? – Dhirendra

+0

@Dhirendra 게시 된 코드에서 꽤 명확하다고 생각합니다. 콜백은 "콜백"이라는 전달 함수이고 data.toString()은 응답입니다. –

답변

1

TLDR : 나는 당신의 코드가 당신에게 말하는 것 이상을하고 있다고 생각합니다.

중요 사항 : (아마도 않습니다) 트리거됩니다 여러 번 "stream mode"에 할 수 있었던 data 이벤트를 HTTP 요청을 퍼팅 할 때, 데이터의 "덩어리"에 대한 각각, 인터넷을 통해 덩어리는 64000 바이트로 1400 사이의 변수가 될 수있다 그래서 당신은 다음 end 이벤트 콜백을 호출, request를 사용하여 시도하거나 수신 된 데이터를 연결할 수 있습니다, 간단한 제안으로

(즉, 불량의 아주 특별한 종류의) 여러 콜백 호출을 기대합니다.

나는 후자의 기술

var assert = require('assert'); 
var https = require('https'); 
var nock = require('nock'); 

function externalService(callback) { 
    // directly from node documentation: 
    // https://nodejs.org/api/https.html#https_https_get_options_callback 
    https.get('https://encrypted.google.com/', (res) => { 

    var data = ''; 
    res.on('data', (d) => { 
     data += d; 
    }); 

    res.on('end',() => callback(null, JSON.parse(data), res)); 
    // on request departure error (network is down?) 
    // just invoke callback with first argument the error 
    }).on('error', callback); 
} 


describe('Learning nock',() => { 
    it('should intercept an https call', (done) => { 
    var bogusMessage = 'this is not google, RLY!'; 

    var intercept = nock('https://encrypted.google.com').get('/') 
     .reply(200, { message: bogusMessage }); 

    externalService((err, googleMessage, entireRes) => { 
     if (err) return done(err); 

     assert.ok(intercept.isDone()); 
     assert.ok(googleMessage); 
     assert.strictEqual(googleMessage.message, bogusMessage); 
     assert.strictEqual(entireRes.statusCode, 200); 

     done(); 
    }); 

    }) 
}) 

를 사용하여 아주 작은 조각을 시도 그리고 심지어 사용하여, 매우 잘 작동 on('data')

편집 : 나는 확대

Reference on how to handle correctly a stream

본격적인 모카 예로서의 사례

+0

답변을 주셔서 감사합니다. 그러나 내가있는 곳을 볼 수는 없습니다. 'end'이벤트를 사용하고 테스트 예상치는 어디입니까? Nock과 HTTP 요청을 모방하는 방법에 대해 잘 모르겠다. 코드가 이미 가지고있는 것과별로 다르지 않다. 어쩌면 내가 틀렸어.하지만 설명 할 수 있니? –

+0

Doing expect (res.statusCode) .to.equal (404)는 여전히 테스트 통과를 허용합니다 –

+0

저는 본격적인 테스트를 실시했으나 물론 지나치게 통과합니다. 문제를 격리해야한다고 생각합니다. vanilla node.js 호출 대신 request/request를 사용하여 훨씬 간단한 인터페이스를 사용해보십시오. mocha가 제대로 실행되는지 확인하십시오. 여기에 참여할 수없는 많은 다른 세부 사항이 있습니다. – colthreepv

관련 문제