2017-06-13 4 views
1

LabとSinonを使って、私のファイルで呼び出されるさまざまなHTTPリクエストに対していくつかのテストを書こうとしています。私はhttp://sinonjs.org/の偽のXMLHttpRequestの例に従っていますが、私がテストを実行すると、実際にはリクエストを捕捉していないようです。ここでSinon Fake XMLがリクエストをキャプチャしていない

(関連)テストコードです:

internals.create = async function (request, reply) { 
    const engineeringTicket = request.payload.type === 'engineering'; 
    const urgentTicket = request.payload.urgency === 'urgent'; 

    if (validation.isValid(request.payload)) { 
    const attachmentPaths = formatUploads(request.payload.attachments); 
    const ticketData = await getTicket(request.payload, attachmentPaths); 

    if (engineeringTicket) { 
     const issueData = getIssue(request.payload); 
     const response = await jira.createIssue(issueData); 
     jira.addAttachment(response.id, attachmentPaths); 
     if (urgentTicket) { 
     const message = slack.getMessage(response); 
     slack.postToSlack(message); 
     } 
    } 

    zendesk.submitTicket(ticketData, function (error, statusCode, result) { 
     if (!error) { 
     reply(result).code(statusCode); 
     } else { 
     console.log(error); 
     } 
    }); 
    } else { 
    reply({ errors: validation.errors }).code(400); // wrap in Boom 
    } 
}; 

をあなたはそれがjira.createIssueを呼び出して見ることができるよう:

context('when provided a valid payload', function() { 
    let xhr; 
    let requests; 

    before(function (done) { 
     xhr = sinon.useFakeXMLHttpRequest(); 
     requests = []; 
     xhr.onCreate = function (req) { requests.push(req); }; 
     done(); 
    }); 

    after(function (done) { 
     // clean up globals 
     xhr.restore(); 
     done(); 
    }); 

    it('responds with the ticket id', (done) => { 
     create(internals.validOptions, sinon.spy()); 
     console.log(requests); // Logs empty array [] 
     done(); 
    }); 
}); 

は、私はここに、他のファイルからインポート機能で作成しますzendesk.submitTicket(いずれもHTTPリクエストを使用してペイロードをAPIに送信します)。しかし、テストを実行した後、要求変数はまだ空であり、要求を取得していないようです。チケット/問題が作成されていないため、実際にリクエストを送信していません。実際にリクエストを取得するには、何を修正する必要がありますか?

答えて

1

問題はNodeJSでコードを実行していますが、SinonのネットワークスタブはXMLHttpRequestです。これはブラウザ固有のAPIです。 Nodeには存在しません。そのため、セットアップはうまく動作しません。

これは、ブラウザでテストを実行する必要があったはずです。 Karma test runnerは、自動化する必要がある場合にこれを手助けすることができます。

ノードでこれを動作させるには、より高いレベルでスタブアウトしようとするアプローチ、つまりzendeskjiraのメソッドをスタブするか、ネットワーク応答をスタブする方法テストを少し脆くする)。

HTTPコールをスタブアウトするには、Nockを使用してノードでこれを行うことができます。あなたは上記のように行われなかったように要求を保存:this article by Morgan Roderickはへのイントロを与えながら

var requests = []; 
var scope = nock('http://www.google.com') 
.get('/cat-poems') 
.reply(function(uri, requestBody) { 
    requests.push({uri, requestBody}); 
}); 

は、あなたがより高いレベルでスタブアウトすることができます方法についていくつかの洞察を得るために、私は、依存性注入とSinonを使用してthis answerを書きましたリンク継ぎ目。

+0

うわー、助けてくれてありがとう!私は、HTTPコールをスタブするためにNockを調べるでしょう、それはまさに私が必要とするもののようです。 Btw、 "この回答"のリンクが機能していないので編集しました – AJwr

関連する問題