2015-11-18 8 views
6

が必要になります。ノードJSユニットテスト:モック私は(Node.jsのモジュールで)jira.jsファイルとして次のセットアップのためのユニットテストを書くの問題が生じています依存

var rest = require('restler'); // https://www.npmjs.com/package/restler 

module.exports = function (conf) { 
    var exported = {}; 

    exported.getIssue = function (issueId, done) { 
     ... 

     rest.get(uri).on('complete', function(data, response) { 
     ... 
    }; 

    return exported; 
}; 

、私が書きたいです私のgetIssue関数の単体テスト。 'restler'はRESTクライアントで、JIRA APIへのREST呼び出しを行い、JIRAの問題をコードで取得します。

したがって、createIssue(..)をテストできるようにするために、私はJasmine単体テストで 'rest' varをモックできるようにしたいと考えています。

どうすればこの方法を模擬できますか?私が先に進むことができるように私にいくつかの指針を与えてください。私は再配線を使ってみましたが、失敗しました。

これは私が(。すなわちgetIssue方法は未定義であることが判明)は動作しません。これは、これまで持っているものです。

var rewire  = require("rewire"); 
var EventEmitter = require('events').EventEmitter; 
var emitter  = new EventEmitter(); 
var cfg   = require("../../../config.js").Configuration; 
var jiraModule = rewire("../lib/jira")(cfg); 
var sinon  = require("sinon"); 
var should  = require("should"); 

// https://github.com/danwrong/restler 
var restMock = { 
    init : function() { 
     console.log('mock initiated'+JSON.stringify(this)); 

    }, 
    postJson : function (url, data, options) { 
     console.log('[restler] POST url='+url+', data= '+JSON.stringify(data)+ 
     'options='+JSON.stringify(options)); 
     emitter.once('name_of_event',function(data){ 
      console.log('EVent received!'+data); 
     }); 
     emitter.emit('name_of_event', "test"); 
     emitter.emit('name_of_event'); 
     emitter.emit('name_of_event'); 
    }, 
    get : function (url, options) { 
     console.log('[restler] GET url='+url+'options='+JSON.stringify(options)); 
    }, 
    del : function (url, options) { 
     console.log('[restler] DELETE url='+url+'options='+JSON.stringify(options)); 
    }, 
    putJson : function (url, data, options) { 
     console.log('[restler] PUT url='+url+', data= '+JSON.stringify(data)+ 
     'options='+JSON.stringify(options)); 
    } 
}; 

var cfgMock = { 
    "test" : "testing" 
}; 

jiraModule.__set__("rest", restMock); 
jiraModule.__set__("cfg", cfgMock); 

console.log('mod='+JSON.stringify(jiraModule.__get__("rest"))); 

describe("A suite", function() { 
it("contains spec with an expectation", function() { 
    restMock.init(); 
    restMock.postJson(null, null, null); 

console.log(cfg.jira); 

    // the following method turns out to be undefined but when i console.log out the jiraModule, i see the entire code outputted from that file 
    jiraModule.getIssue("SRMAPP-130", function (err, result) { 
     console.log('data= '+JSON.stringify(result)); 
    }); 

    expect(true).toBe(true); 
}); 
}); 

誰かが依存関係を必要とする「休息」を模擬する方法で私を導くことができる場合&ユニットテストこのメソッドは非常に便利です。

また、「conf」がmodule.exportsに渡されるのをどうやって模擬すべきですか?

おかげ

答えて

5

あなたは依存関係をモック/スタブにしproxyquireまたはmockeryを使用することができます。

以下の例では、proxyquireを使用しました。それが役に立てば幸い。


/* ./src/index.js */ 
var rest = require('restler'); 

module.exports = function (conf) { 
    var exported = {}; 

    exported.getIssue = function (issueId, done) { 
    var uri = ''; 
    var reqObj = ''; 
    var service = { 
     auth : '' 
    }; 

    rest.postJson(uri, reqObj, service.auth).on('complete', function(data, response) { 
     done(data, response); 
    }); 
    }; 

    return exported; 
}; 

/* ./test/index.js */ 
var proxyquire = require('proxyquire'); 
var assert  = require('chai').assert; 
var restlerStub = { 
    postJson: function() { 
    return { 
     on: function(event, callback) { 
     callback('data', 'response'); 
     } 
    } 
    } 
} 

var index = proxyquire('../src/index', {'restler': restlerStub})(); 

describe('index', function() { 
    it('should return the desired issue', function(done) { 
    var issue = index.getIssue('issueId', function(data, response) { 
     assert.equal(data, 'data'); 
     assert.equal(response, 'response'); 
     done(); 
    }) 
    }); 
}); 

/* ./package.json */ 
{ 
    "scripts": { 
    "test": "mocha" 
    }, 
    "dependencies": { 
    "restler": "^3.4.0" 
    }, 
    "devDependencies": { 
    "chai": "^3.4.1", 
    "mocha": "^2.3.4", 
    "proxyquire": "^1.7.3" 
    } 
} 
+0

ジャスミン・ノードは、なぜあなたはモカを使用している、タグ付けされていますか? –

+0

Opps、私はそれを気にしませんでしたが、依存関係を模倣することはテストフレームワークとは関係ありません。 – sarbbottam

+0

こんにちは、指導のおかげで!もし私がproxyquireを使用している場合、私はconf内をどのように渡すのですか?私はconfを模倣する必要があります....これはmodule.exportsの引数として取られます.. – Rookie

関連する問題