私の角型アプリケーションにJasmineを使ってテストを書いています。すべてのテストは合格です。Jasmine:約束を返す関数をテストする
class xyz implements ng.IComponentController {
private myList: ng.IPromise<MyList[]> ;
//declare necessary variables
/* @ngInject */
constructor(private ListService: ListService,
) {
this.myList = this.ListService.getList();
}
public onChange(): void {
this.isNameUnique(this.name).then(function(unique){
scope.isUnique = unique;
scope.errorNameInput = !reg.test(scope.name) || !scope.isUnique;
scope.myFunction({
//do something
});
});
}
public isNameUnique(name: string): ng.IPromise<boolean> {
return this.myList
.then(
(names) => {
_.mapValues(names, function(name){
return name.uuid.toLowerCase();
});
return (_.findIndex(names, { uuid : uuid.toLowerCase() }) === -1) ? true : false;
});
}
}
をここで、私は、コンストラクタ自体で事前移入私のリストにListServiceを使用しています(それは一度だけサービスを呼び出します):私のクラスには、次のようになります。次に、onChangeメソッドで、名前が一意であるかどうかを確認しています( )。 isNameUniqueはブール値の約束を返しています。 今、私はテストのために100%のカバレッジを取得しようとしています。私はここでisNameUniqueメソッドをテストすることについて混乱している。
私はこのテストが行をカバーするために期待される
this.$scope.myFunction = jasmine.createSpy('myFunction');
it('should ...', function() {
this.view.find(NAME_INPUT).val('blue').change(); // my view element.
this.getList.resolve(myList);
this.controller.isNameUnique('blue').then(function (unique) {
expect(unique).toEqual(false); //since blue is already in my json
expect(this.controller.errorNameInput).toEqual(true); //since its not unique, errornameinput will be set to true
expect(this.$scope.myFunction).toHaveBeenCalled();
});
});
(と仮定します。myListは私がサービスから取得します応答に似てJSONである)::私の最初のテストはあるmyFunction()
のscope.errorNameInput = !reg.test(scope.name) || !scope.isUnique
と呼び出しを、それはまだショーカバーされていない。理由は分かりません。
Angular and Jasmineが初めてのので、何か間違っているとわかりましたら教えてください。ありがとう。
私は約束がすでに解決していると思っていたので、それが私に唯一の正しい結果を与え、テストが合格になったのです。私はこれを読んでみましょう。ありがとう。 –
あなたの約束解決の理論をテストするのは簡単です。 'then()'の中で 'console.log()'をちょっとして、あなたのテストでヒットしたかどうかを確認してください:) –
ここでは、 1.x(同じ原則が適用されます):http://www.bradoncode.com/blog/2015/07/13/unit-test-promises-angualrjs-q/ –