要求ライブラリの上に OAuth の更新許可を実装する小さな REST ライブラリのテストを書いています。その機能の一部として、次のような再試行機能を提供していますrest.js
。
const auth = require('./auth');
const request = require('request');
function retry(headers, responseHandler) {
headers.auth.bearer = auth.getToken();
request(headers, function(err, resp) {
if (resp.error && resp.error == 'invalid_token') {
return auth.renew(function(e, r) { retry(headers, responseHandler); });
}
// handle happy case
});
});
内部的に知られている更新トークン内auth.renew
の情報を使用して、トークン プロバイダーに投稿することです。headers
重要な点は、 を使用してこれrequest.post
を行い、再帰イベント ハンドラをリクエスト ライブラリに渡すことです。
当然、これをテストするとき、発信 HTTP 呼び出しは必要ありません。したがって、sinon を使用してそれらをスタブ化します。
const requestStub = sinon.stub(),
rest = proxyquire('./rest', { 'request': requestStub }),
authFail = { error: 'invalid_token' },
authSuccess = { token: '123' };
describe('#retry', () => {
it('calls retry twice on failed auth', () => {
requestStub.yields(null, authFail);
requestStub.post = sinon.stub().yields(null, authSuccess);
retry({}, () => {});
sinon.assert.calledTwice(requestStub);
});
});
問題は、それ自体がauth.renew
喜んで進行するためrequire('request')
、私のスタブが表示されないことです。だから私の質問は次のとおりだと思います:自分のスタブを自分の代わりにauth
使用するにはどうすればよいですか?request
sinon がXHR をスタブできることは知っていますが、それは私が望むものに対する多くの低レベルの努力のようです。