2017-03-21 1 views
10

私のnode.jsプロジェクト内でスタブ呼出しにtestdoubleを使用しています。この特定の関数は約束をラップしており、関数内に複数のthen呼び出しを持っています。testdoublejsを使用して複数の接続をテストする約束

function getUser (rethink, username) { 
    return new Promise((resolve, reject) => { 
    let r = database.connect(); 
    r.then(conn => database.table(tablename).filter({username})) 
    .then(data => resolve(data)) 
    .error(err => reject(err)); 
}); 
} 

だから私はresolverejectがエラー条件に基づいて正しく処理されているかどうかを判断したいと思っています。そこに私が検証する必要のあるカスタムロジックがあるとします。私のテストのために

import getUser from './user'; 
import td from 'testdouble'; 
test(t => { 
    const db = td.object(); 
    const connect = td.function(); 
    td.when(connect('options')).thenResolve(); 
    const result = getUser(db, 'testuser'); 
    t.verify(result); 
} 

問題は、接続の結果を約束する必要があるということであるので、私は解決したり拒否し、別の約束にする必要がある値で解決し、その後使用しています。

それに関連する行は、database.connect()の結果であるとは限りません。

TypeError: Cannot read property 'then' of undefined 

誰もがTest Doubleでこのタイプの呼び出しをスタブして成功しましたか?

+0

エラーを表示できますか? –

+0

@ ckross01エラーおよび/またはスタックトレースを表示していますか? – GPX

+0

私は本質的に 'database.connect'の結果が約束ではないと言っているという質問にエラーを追加しました。 – ckross01

答えて

1

解決方法が分かりました。ソリューションには注意すべきことがいくつかあり、遭遇しました。要するに、解決はこれで終わった。

td.when(database.connect()).thenResolve({then: (resolve) => resolve('ok')}); 

これは、test doubleがデータベース接続を見るときに返される可テーブルを解決する。その後の呼び出しも追加できます。

あなたはdatabase.connect()にオブジェクトに送信する場合、あなたはそれをチェック===平等をやっているし、あなたはそれが正しくtd.whenを使用するため、そのオブジェクトへの参照を持っている必要がありますことを認識する必要があり、注意すべき部分もあります。

0

テストダブルは、単体テスト用のスタブを提供します。あなたのケースでは、dbは私たちが嘲笑する必要があるオブジェクトです。

td.object(Database) // Database is the class or constructor of your db

てあざけるDBを作成することは正しい選択になりますが、単にあなたが、この場合に必要とする方法を模擬するために、私はその方法を選択しないだろう。

ここでテストしたモジュールは「some.js」です:

function getUser (database, username) { 
    return new Promise((resolve, reject) => { 
    let r = database.connect(); 
    r.then(conn => database.table('table').filter({username:username})) 
     .then(data => resolve(data)) 
     .catch(err => reject(err)); 
    }); 
} 

module.exports = getUser; 

れモカとchai.expectを使用してテストファイルは、また、ここに他のユニット・テスト・モジュールのようになります。

let td = require('testdouble'); 
let expect = require('chai').expect; 

const getUser = require('./some'); 

describe('some.js',()=>{ 
    it('getUser',()=>{ 
    const db = {}; 
    const name = 'name'; 
    db.connect = td.function(); 
    db.table = td.function('table'); 
    db.filter = td.function('filter'); 
    td.when(db.connect()).thenResolve(db); 
    td.when(db.table('table')).thenReturn(db); 
    td.when(db.filter({username: name})).thenResolve('some user data'); 
    return getUser(db, name) 
     .then(user=>{ 
     expect(user).to.equal('some user data') 
     }) 
     .catch(e=>assert(e)) 
    }) 
}) 

これらのいずれかがあなたを混乱させるかどうかお知らせください。

関連する問題