2016-10-16 23 views
0

私は、いくつかのREST APIから情報を取得する私の関数の単体テストを書いています。私はramdaFutureタイプ(source)を使用しています。
次のテストは、奇妙な作品:Chai 'expect'がコールバック内で実行されない

it('should return Maybe of Nothing', done => { 

    let response = { 
     status: 200, 
     json:() => { 
     return { 
      results: [] 
     } 
     } 
    } 

    let fakeFetch = { 
     fetch:() => { 
     return new Promise((resolve, reject) => { 
      resolve(response) 
     }) 
     } 
    } 

    //     String -> Future Error Maybe 
    let result = Utils.fetchGiantBomb(faker.random.word(), fakeFetch.fetch); 

    result.fork(err => { 
     assert.fail(err, 'expected to return Maybe of Nothing'); 
     done(); 
    }, data => { 
     expect(Maybe.isJust(data)).to.be.true; 
     done(); 
    }) 

    }) 

dataタイプMaybe.Nothingでなければなりません。 Maybe.isNothingがテストに合格すると思うが、テストが失敗したときに何が起こるか見たいので、それをMaybe.isJustに設定してfalseを返す。これをしばらく見てから、expectが失敗したときには、エラー処理(errコールバック)にジャンプし、アサートを実行するのをやめて(2000msのタイムアウトになります)気づきました。

Futureソースでは、成功コールバックが失敗すると、失敗コールバックが実行されることがわかりました。このテストを完了して、データが予期した通りではないことを表示するにはどうすればよいですか?

答えて

0

私は問題は、あなたのREST呼び出しが失敗したときに、done()が呼び出されないと思います。

ない、それが失敗したときexpectが.catch方法がありますが、あなたが期待する関数の最後に

.catch(done); 

を追加しようとすることができるかどうか確認してください。

希望に役立ちます。

0

future.fork(errorHandler, successHandler)を呼び出すと、現在successHandlerにスローされた例外はすべてerrorHandlerに伝播します。この周り

一つの方法は、(それが文書化されているように、おそらく理想的ではないが)successHandlerにスローエラーが捕捉されないfuture.forkはなくfuture._fork(errorHandler, successHandler)を呼び出すことです。私はRAMDAが例外をキャッチしてはならないと思います

result.fork(err => { 
    done('Expected to return Maybe of Nothing: ' + err); 
}, data => { 
    expect(Maybe.isJust(data)).to.be.true; 
    done(); 
}) 
0

はまた、テストフレームワークの数は、次のようなdoneコールバックにエラーを渡すサポートしています。しかし、私は彼らが何をしようとしているのか分かりません。

あなたはモカを使用しているようです。あなたの未来を約束してから、約束を守ることをお勧めします。すなわち:

const futureToPromise = future => { 
    return new Promise((resolve, reject) => future.fork(reject, resolve)) 
} 

it('should return Maybe of Nothing',() => { 

    let response = { 
    status: 200, 
    json:() => { 
     return { 
     results: [] 
     } 
    } 
    } 

    let fakeFetch = { 
    fetch:() => { 
     return new Promise((resolve, reject) => { 
     resolve(response) 
     }) 
    } 
    } 

    // String -> Future Error Maybe 
    let result = Utils.fetchGiantBomb(faker.random.word(), fakeFetch.fetch); 
    // return it because Mocha can handle this 
    return futureToPromise(result).then(data => { 
    expect(Maybe.isJust(data)).to.be.true; 
    },() => { 
    // fail 
    assert.fail(err, 'expected to return Maybe of Nothing'); 
    }) 
}) 
関連する問題