2016-09-06 71 views
2

波紋管是例子,測試失敗 - str未定義。 如何從angular2中獲得承諾的價值?測試承諾<string>角度2單元測試中的值

describe('Test',() => { 
     it('case of string',() => { 
      let t: Promise<string> = deserializeSimpleField(...); 
      let str:string; 
      t.then(value=>str = value); 
      expect(str).toEqual('name'); 
     });}); 

回答

3

異步執行具有傳染性。你不能回去同步執行。

describe('Test',() => { 
    it('case of string', inject([AsyncTestCompleter], (async: AsyncTestCompleter) => { 
     deserializeSimpleField(...) 
     .then(value => { 
      expect(value).toEqual('name'); 
      async.done(); 
     }); 
    }); 
}); 

我看着它在https://github.com/angular/angular/blob/master/modules/@angular/forms/test/form_array_spec.ts

更新

describe('Test',() => { 
    it('case of string', async(() => { 
     return deserializeSimpleField(...) 
     .then(value => { 
      expect(value).toEqual('name'); 
      async.done(); 
     }); 
    })); 
}); 
+0

親愛@Gunter我用@角/測試,並有AsyncTestCompleter缺失?存在的方式是通過@ angular/testing來完成的嗎? – emanuel07

+0

實際上我不知道正確和最新的方法是做異步測試。我無法在changelog中找到任何內容。我剛剛在最近更新的github repo中查找了一個測試。你可以請嘗試我更新的答案? (不知道是否需要添加'return')。 –

+0

更新版本帶來: TypeError:AsyncTestZoneSpec不是構造函數 在runInAsyncTestZone – emanuel07

2
I resolve question following way,(using fakeAsync,tick..) 

require('zone.js/dist/fake-async-test'); 
import {describe, it, expect, fakeAsync, tick} from '@angular/testing' 
describe('my first test',() => { 
    it('Promises fulfilled by tick',fakeAsync((): void => { 
     let promise:Promise<number> =Promise.resolve(11); 
     let x:number; 
     promise.then(v => { 
      x = v; 
     }); 
     tick(); 
     expect(x).toBe(11); 
    })); 
}); 
+0

親愛的@Gunter請參閱解決方案。 – emanuel07

+0

唯一的區別似乎是'假',對吧? (和'tick();') –

+0

是的。 tick() - 模擬fakeAsync區域中定時器的異步時間流逝。 – emanuel07