一部のクラスをテストするためにmocha
を使用しており、request
ライブラリのスタブを作成する必要があります。
sinon
を使用しており、request.get
メソッドのスタブを作成できますが、request
メソッドのスタブを作成できません(http呼び出しはサーバーへの接続を試みます)。私が読んだように、request.get
はrequest
のエイリアスですが、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する方法はどれですか?
request
は優れたライブラリですが、適切に構造化されたAPIの良い例ではありません。また、モジュールrequest
は、追加のメソッドを持つ関数として定義されているため(express
と同様に)、request
を使用して関数sinon
のスタブを作成することはできません。
あなたができる最善のことは、コードでrequest
関数を使用することを避け、簡単にスタブできるrequest.get
、request.post
などのみを使用することです。
2番目の例でRequest
のスタブを作成しても、Requestはメソッドではないため、役に立ちません。 ソースコード を参照してください。
まだ誰かがこれに対する答えを探している場合、sinonを使用してリクエスト用のスタブを作成できるようです:
before(function(done){
sinon
.stub(request, 'get')
.yields(null, null, JSON.stringify({login: "bulkan"}));
done();
});
詳細はこちら こちら
別の回避策は、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()
});
});
詳細については、ノードのモックを使用した単体テストに関するこの記事 を確認してください
質問の回答の1つで述べたように nodejsでリクエストとレスポンスを模擬してミドルウェア/コントローラーをテストする方法 、 node-mocks-http パッケージは、リクエストとレスポンスのモックを構築する方法を提供します。