2017-03-03 13 views
7

以下のコードで、エクスポートされたメソッドを単体テストする必要があります。返されたPromiseの拒否/解決を制御するプライベートメソッドの値を嘲笑したい。 clientはすでにデータベースに接続されているオブジェクトnode-postgresです。単体テストで、リクエスト、パイプ、ストリームをモックで使用するプライベートメソッド

は、私は必要なライブラリをスタブにしproxyquireを使用することができます知っているが、どのように私は、連鎖方法.on('error', ...).pipe(stream).on('end', ...)私が返された値を制御することができるように模擬することができます。

注記示されたエクスポートされたメソッドは、実際のものを単純化したものであり、importDomainのエクスポートは実行できません。

const copyFrom = require('pg-copy-streams').from 
const request = require('request') 
const Promise = require('bluebird') 

// private 
function importDomain (client, domain) { 
    return new Promise((resolve, reject) => { 
    let stream = client.query(copyFrom(`COPY ${domain.table} FROM STDIN;`)) 

    let req = request(`${domain.url}`) 
    req.on('error', reject) 
    req.pipe(stream) 
     .on('error', reject) 
     .on('end', resolve) 
    }) 
} 

// public 
module.exports = (client) => { 
    let domain = someFunctionReturningDomain() 
    importDomain(client, domain) 
} 

答えて

1

importDomain関数をユニットテストするには、リクエストを模擬する必要があります。これはあなたのモジュールで必要とされるので、テストされ、正常に動作するとみなされるべきです。

パラメータとしてクライアントを指定したためです。そのクエリメソッドと返されるストリームは、すでにモジュールから完全に制御されています。

req.pipeを置き換えるだけで、クライアントが作成したストリームに渡される内容を制御することができます。

+0

.on()はどのようにテストされていますか?私は、これをどのように行うことができるかを示すいくつかのコードサンプルを見たいと思います。 – Brian

+0

リクエストを模擬するときは、書き込み可能なストリームとして実装し、テスト中にデータを書き込みます。 http://stackoverflow.com/questions/33141012/how-to-mock-streams-in-nodejsを参照してください。 –

関連する問題