2016-09-29 480 views
1

我有一個角2項目,因緣和茉莉花以下測試:Angular 2 Testing:什麼是異步測試的正確方法?

let a: any; 

beforeEach(() => { 
    a = {}; 

    setTimeout(() => { 
     a.test(); 
    }, 1000); 
}); 

it('should work with async and promise', async(() => { 

    return new Promise((resolve) => { 
     a.test =() => { 
      console.log('erster test'); 
      assertThat(true, is(false)); 
      resolve(); 
     }; 
    }); 
})); 

it('should work with async and done', async((done) => { 

    a.test =() => { 
     console.log('zweiter test'); 
     assertThat(true, is(false)); 
     done(); 
    }; 
})); 

it('should work with done', (done) => { 

    a.test =() => { 
     console.log('dritter test'); 
     assertThat(true, is(false)); 
     done(); 
    }; 
}); 

唯一可行的情況下(意味着失敗)是最後一個只是一個「完成」的回調。第二個我不確定,但不應該第一個是在角度2測試異步的正確方法?我認爲用「異步」你在你的函數週圍放置一個區域,它正在等待返回的承諾?我試圖理解異步實現,但我沒有得到它:https://github.com/angular/angular/blob/master/modules/%40angular/core/testing/async.ts

回答

3

該區域被創建inside the async method。所以你的setTimeout(在beforeEach)不在該區域內。如果將setTimeout移動到async回調,則它位於區域中,並且測試應按預期工作(意味着等待異步任務完成)。

it('should work with async and promise', async(() => { 
    setTimeout(() => { 
    a.test(); 
    }, 1000); 
    return new Promise((resolve) => { 
    a.test =() => { 
     console.log('erster test'); 
     expect(true).toBe(false); 
     resolve(); 
    }; 
    }); 
})); 

it('should work with async and done', async((done: Function) => { 
    setTimeout(() => { 
    a.test(); 
    }, 1000); 
    a.test =() => { 
    console.log('zweiter test'); 
    expect(true).toBe(false); 
    done(); 
    }; 
})); 
+0

謝謝,也許我的例子不是那麼好。 「a」實際上是對視頻標籤的引用,「test()」是它的「播放」功能。所以我想我不能在區域中移動onplay的調用,因爲它被視頻本身解僱了嗎?我必須在這裏採取「完成」,還是有異步/區域的解決方案? – user2170547

+0

我不知道。我沒有任何測試視頻的經驗,我也不完全確定你的意思。如果您發佈一個真實的例子,也許我可以用它玩:-) –

+0

對不起,我試圖創建一個plunker,但不能讓它運行。但你的提示也需要在該區域幫助我瞭解它。最後我只使用了它,它的工作原理。 – user2170547

相關問題