2017-10-09 22 views
0

내 NodeJS 응용 프로그램에서 request-promise-native를 사용합니다.NodeJS 단위 테스트를 위해 request-promise-native를 조롱하는 방법은 무엇입니까?

import request from 'request-promise-native' 
const https = require('https') 

const myRequest = request.defaults({ 
    baseUrl: 'myBaseUrl', 
    agent: new https.Agent({ keepAlive: true }) 
}) 

async function findResults() { 
    const myResponse = await myRequest.get({ 
     uri: '/myUri' 
    }) 
    return myResponse 
} 

위의 단위 테스트 요청을 조롱하려고합니다. 하지만 여전히 실제 호출을하고 내 모의 객체 호출을 거치지 않고 결과를 얻습니다.

나는 Sinon를 사용하는 것으로, 다양한 변화를 시도 :

import test from 'ava' 
import sinon from 'sinon' 
import Bluebird from 'bluebird' 
import request from 'request-promise-native' 
import { findResults } from '../services/results' 

test.only(async t => { 
    let response = JSON.stringify({ 
    statusCode: 504 
    }) 

    sinon.stub(request, 'get').returns(Bluebird.resolve(response)) 

    const returnValue = await findResults() 
    console.log('return: ', returnValue) 

    t.is (1, 1) 
}) 

나는 또한 proxyquire 및 sinon의 가짜 서버의 변화를 시도

import mockery from 'mockery' 
import { findResults } from '../services/results' 

test.before(async t => { 
    mockery.enable({ 
     warnOnReplace: false, 
     warnOnUnregistered: false, 
     useCleanCache: true 
    }) 

    mockery.registerMock('request-promise-native', function() { 
    // var response = fs.readFileSync(__dirname + '/data/' + filename, 'utf8'); 
    let response = JSON.stringify({ 
     statusCode: 9 
    }) 
    return Bluebird.resolve(response.trim()); 
    }) 
}) 

test.after(async t => { 
    mockery.disable() 
    mockery.deregisterAll() 
    // done() 
}) 

test.only(async t => { 
    const returnValue = await findResults() 
    console.log('return: ', returnValue) 

    t.is(1, 1) 
}) 

(문서 https://www.npmjs.com/package/request-promise 당) 조롱 사용. 그러나 나는 그들에게 일하게 할 수 없었다.

제안 사항?

답변

1

일반적으로 가져온 패키지에서 sinon 스파이를 사용하는 경우에는 sinon.spy(request.prototype, 'get')과 같은 스텁을 만듭니다. 요청이 프로토 타입의 메소드를 정의하지 않기 때문에 아마도 여기서는 작동하지 않습니다. 이 문제를 해결할 수있는 한 가지 방법은 인스턴스에 스텁을 만드는 것입니다 (호출 할 수있는 경우). 아래 예 :

const request = require('request-promise-native') 
const https = require('https') 
const {expect} = require('chai') 
require('mocha') 
const sinon = require('sinon') 
const Bluebird = require('bluebird') 

const myRequest = request.defaults({ 
    baseUrl: 'myBaseUrl', 
    agent: new https.Agent({ keepAlive: true }) 
}) 

async function findResults() { 
    const myResponse = await myRequest.get({ 
     uri: '/myUri' 
    }) 
    return myResponse 
} 



async function mainTest() { 
    let response = JSON.stringify({ 
    statusCode: 504 
    }) 
    sinon.stub(myRequest, 'get').callsFake((params) => Bluebird.resolve(response)) 
    const returnValue = await findResults() 
    console.log('return: ', returnValue) 
} 

mainTest() 
+0

감사합니다. @ElioRubens. 나는 너의 제안에 약간의 변화를 보냈다. 테스트 파일에서 가져온 NodeJS 파일에서 myRequest를 내 보냅니다. 그 다음 그것을 찔렀다 : sinon.stub (myRequest, 'post'). returns (response). 그것은 작동합니다. – Canton

+0

@Canton, 감사합니다. 도움이 될 수있어서 기쁩니다. 질문에 대답했다고 생각되면 받아 들인 대답으로 표시하는 것이 도움이 될 것입니다. – ElioRubens

0

이 경우 프록시 쿼리를 사용했습니다. 다음은 요청을 조롱하기 위해 사용했던 일부 코드입니다.