1

要求ライブラリの上に 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 をスタブできることは知っていますが、それは私が望むものに対する多くの低レベルの努力のようです。

4

1 に答える 1