2017-10-12 15 views
0

私は、マングースのフィールドの検証を単体テストする方法を見つけるのに苦労しています。私はgoogleIdの正しい検証を持っている場合、それはerr.errors.googleIdが存在を主張しますので、テストに合格します、ので、意図したとおり、このテストは機能していない単体テストの検証を約束/拒否で行う

it('should be invalid if googleId is empty',() => 
    testBook.googleId = ''; 
    const newBook = new Book(testBook); 
    return newBook.validate().catch((err) => { 
    should.exist(err.errors.googleId); 
    }); 
}); 

が、私はそうではない場合:私は現在、次のテストを持っていますgoogleIdの検証がありますが、.catch()が呼び出されることはなく、テストが合格であるとみなされるため、これも合格となります。

私は.then()should.fail()を入れて試してみたが、それはshould.fail()エラーでcatchedされる何の検証はありませんならば、それは常に.catch()ではなく、別のエラーで終わるその方法は、検証があります場合、それはモデルでキャッチします検証エラーです。

この種のテストを行うにはどうすればよいでしょうか?

ありがとう!

EDIT: 私はnewBook.validate()のコールバックを使用してみました、それは動作しますが、私はモデルのメソッドのコールバックを使用することはありません、私はいつも約束を使用する傾向があるので、私は、この特定のケースでは、コールバックを使用するか、まだあります約束を使ってそれを処理するより良い方法は?

答えて

2

その後、2番目のパラメータを使用して、例えば最初に投げる何か入れることができます。newBook.validate()が拒否されていないのであれば、今テストは失敗します

return newBook.validate().then(
    resp => throw new Error("Test failed this should not resolve"), 
    err => should.exist(err.errors.googleId); 
}); 

を。 catch()を使用していないので、テストが失敗するのを止めることはありません。あなたのテストが合格するように約束が拒否された場合(条件が満たされたと仮定して)これは、catch()と違い、then()のエラーコールバックはthen()にスローされたエラーをキャッチしないためです。もちろん、最初のコールバックに何かを入れて、assert.fail()のようなエラーを出したり、あなたのライブラリが持っているものを置いたりすることができます。

+0

ああ、私は 'then()'コールバックについて知らなかった、私は今、最初のコールバックでshould.fail()を返すようになり、あなたが言ったように、そしてすべての作品の2番目のアサーションを作る素晴らしい:Dありがとう! –

1

Promiseテストの動作を正常にするためにヘルパーが含まれているchai-as-promisedプラグインがあります。

.rejectedWithおよび.rejected通常は.throwのようなエラーを処理します。

const chai = require('chai') 
chai.should() 
chai.use(require('chai-as-promised')) 

it('should be invalid if googleId is empty', function(){ 
    testBook.googleId = '' 
    const newBook = new Book(testBook) 
    return newBook.validate() 
    .should.be.rejectedWith('Validation Failed') 
    .and.eventually.have.nested.property('errors.googleId') 
}); 

ただ、それ以外のものはめちゃくちゃに行くあなたが他のchai pluginsをロードしている場合は、最後のプラグインを読み込むことを確認してください。

関連する問題