2017-06-15 4 views
0

特定のメソッドが呼び出されたときにいくつかのメソッドが呼び出されるかどうかをチェックするテストルーチンを開発しています。メソッドが約束コールバックによって呼び出されたかどうかのテスト

私はジャスミンを使用しています。

最初のレベルをテストするとうまくいきますが、第1レベルのコールバックコールバック関数内で別のメソッドを呼び出すと、jasmine spyOnは機能しません。ただ、テストのために、私は外にコールバックするために、2つのコード行を移動し、テストが正常に動作します

onLogin(form: NgForm) { 
    this.submitted = true; 
    if (form.valid) { 
    this.auth.login(this.login.username, this.login.password).then((value) => { 
     if(value) { 
     this.menu.enable(true, 'loggedInMenu'); 
     this.menu.enable(true, 'loggedOutMenu'); 
     this.navCtrl.setRoot(TabsPage); 
     } else { 
     let alert = this.alertCtrl.create({ 
      title: 'Ops', 
      subTitle: 'Some things wrong.', 
      buttons: ['OK'] 
     }); 
     alert.present(); 
     } 
    });  
    } 
} 

// Test Routine 
describe("onLogin",() => { 
    it("makes expected calls when authentication successfully",() => { 
     const menuControllerStub = fixture.debugElement.injector.get(MenuController); 
     const authStub = fixture.debugElement.injector.get(Auth); 
     const ngFormStub = fixture.debugElement.injector.get(NgForm); 

     // it isn't works 
     spyOn(menuControllerStub, "enable").and.callFake(() => {}); 

     // it's work fine 
     spyOn(authStub, "login").and.callFake((username:string, password: string) => { 
      return new Promise((callback, fallback) => { 
       callback(true); 
      }); 
     }); 

     comp.onLogin(ngFormStub); 

     // failed 
     expect(menuControllerStub.enable).toHaveBeenCalled(); 
     // success 
     expect(autenticacaoStub.login).toHaveBeenCalled(); 
    }); 

小さな例私のコードならば。たとえば :

onLogin(form: NgForm) { 
    this.submitted = true; 
    if (form.valid) { 
     this.menu.enable(true, 'loggedInMenu'); 
     this.menu.enable(true, 'loggedOutMenu'); 

     this.auth.login(this.login.username, this.login.password).then((value) => { 
     if(value) { 
      this.navCtrl.setRoot(TabsPage); 
     } else { 
      let alert = this.alertCtrl.create({ 
      title: 'Ops', 
      subTitle: 'Some thing wrong.', 
      buttons: ['OK'] 
      }); 
      alert.present(); 
     } 
    });  
    } 
} 

誰でも手伝ってもらえますか?

答えて

0

あなたはプロミスを返すが、それは決して解決されないか拒否されたからだ。

spyOn(authStub, "login").and.callFake((username:string, password: string) => { 
     return Promise.resolve(true); 
    }); 

EDITをやってみてください、これを試してください:

let spy = spyOn(menuControllerStub, 'enable').and.returnValue(false); 
// ... 
expect(spy).toHaveBeenCalledTimes(2); 
+0

それは私のコードよりも簡単ですが、まだ動作しません。私はログインコールバックにいくつかのconsole.logを入れました。私は両方のサンプル(あなたと私)がthis.menu.enableメソッドを呼び出すのを見ています。 – andercruzbr

+0

あなたがスパイを 'spyOn(authStub、 'login')と.returnValue(Promise.resolve(true));で変換するとどうなりますか? – trichetriche

+0

同じ動作です。私は問題がspyOn(menuControllerStub、 "enable")メソッドが呼び出されたかどうかをチェックできないと思う。 – andercruzbr

関連する問題