web-dev-qa-db-ja.com

MochaでSinonを使用してリクエストスタブを作成する

一部のクラスをテストするためにmochaを使用しており、requestライブラリのスタブを作成する必要があります。

sinonを使用しており、request.getメソッドのスタブを作成できますが、requestメソッドのスタブを作成できません(http呼び出しはサーバーへの接続を試みます)。私が読んだように、request.getrequestのエイリアスですが、request.getをスタブにした場合、request呼び出しには影響しません。

このコードは機能します(request.getを使用):

テストでは:

request = require 'request'

describe "User test", ->
  user = {}
  before (done) ->
    user = new test.user('Ander', 18)    
    sinon.stub(request, 'get').yields(null, {statusCode: 200}, 'foo')        
    done()
  after (done) ->
    request.get.restore()
    done()
  it "testing server response", ->
    user.getData().should.equal 'ander'

ソース:

request = require 'request'

class User
  contructor(@name, @age): ->
  getData: ->
    mydata = ''
    request.get 'http://127.0.0.1:8080/', (err, response, body) ->        
      if not err and response.statusCode == 200
        mydata = body
      else
        err = throw new Error "Errorea"
    mydata

しかし、これは機能しません(提供されたURLに接続しようとします):

テストでは:

request = require 'request'

describe "User test", ->
  user = {}
  before (done) ->
    user = new test.user('Ander', 18)    
    sinon.stub(request, 'Request').yields(null, {statusCode: 200}, 'foo')
    #Creating the stub this way, doesn't work neither
    #sinon.stub(request, 'get').yields(null, {statusCode: 200}, 'foo')
    done()
  after (done) ->
    request.Request.restore()
    done()
  it "testing server response", ->
    user.getData().should.equal 'ander'

ソース:

request = require 'request'

class User
  contructor(@name, @age): ->
  getData: ->
    mydata = ''
    request 'http://127.0.0.1:8080/', (err, response, body) ->        
      if not err and response.statusCode == 200
        mydata = body
      else
        err = throw new Error "Errorea"
    mydata

request呼び出しのスタブを作成する正しい方法はどれですか? stubedする方法はどれですか?

23
Ander2

requestは優れたライブラリですが、適切に構造化されたAPIの良い例ではありません。また、モジュールrequestは、追加のメソッドを持つ関数として定義されているため(expressと同様に)、requestを使用して関数sinonのスタブを作成することはできません。

あなたができる最善のことは、コードでrequest関数を使用することを避け、簡単にスタブできるrequest.getrequest.postなどのみを使用することです。

2番目の例でRequestのスタブを作成しても、Requestはメソッドではないため、役に立ちません。 ソースコード を参照してください。

28
ivoszz

まだ誰かがこれに対する答えを探している場合、sinonを使用してリクエスト用のスタブを作成できるようです:

before(function(done){
  sinon
    .stub(request, 'get')
    .yields(null, null, JSON.stringify({login: "bulkan"}));
  done();
});

詳細はこちら こちら

6
Bianca

別の回避策は、sinonモジュールとrequest依存関係を使用してスタブを生成することです。対応するモジュールのproxyquireを使用してオーバーライドできます。

var sinon = require('sinon');
var proxyquire = require('proxyquire');

describe('something', function(){
  var request;
  var overriddenModule;
  before(function(){
    request = sinon.stub();
    // overriding the 'request' dependency with the stub
    overriddenModule = proxyquire('path_to_module_using_request', {'request': request});     
  });
  it("should do something",function(done){
    // stubbing the request(options,callback) method
    request.withArgs(sinon.match.any,sinon.match.any).yields(null,null,responseBody);
    overriddenModule.method_which_is_doing_request;
    // our logic and assertions before calling done()
  });  
});

詳細については、ノードのモックを使用した単体テストに関するこの記事 を確認してください

2
Magesh

質問の回答の1つで述べたように nodejsでリクエストとレスポンスを模擬してミドルウェア/コントローラーをテストする方法 、 node-mocks-http パッケージは、リクエストとレスポンスのモックを構築する方法を提供します。

2
P Walker