2016-08-22 32 views
1

這是代碼:角2 RC-5異步測試工作不

import { 
    async, 
    inject, 
    TestBed 
} from '@angular/core/testing'; 
import { 
    Http, 
    Response, 
    ResponseOptions, 
    RequestOptions, 
    BaseRequestOptions, 
    ConnectionBackend 
} from "@angular/http"; 
import {MockBackend, MockConnection} from "@angular/http/testing"; 
import {HttpInterceptor, RequestWrapped} from "./http.interceptor.service.ts"; 

describe("Http interceptor",() => { 
    beforeEach(() =>{ 
    TestBed.configureTestingModule({ 
     providers: [ 
     MockBackend, 
     BaseRequestOptions, 
     {provide: ConnectionBackend, useClass: MockBackend}, 
     {provide: RequestOptions, useClass: BaseRequestOptions}, 
     Http 
     ], 
    }); 
    }); 

    it('should get blogs', inject([Http, MockBackend], (http:Http, backend:MockBackend) => { 
    let connection:MockConnection; 
    backend.connections.subscribe(connection => 
     connection.mockRespond(new Response(new ResponseOptions('awesome'))) 
    ); 
    http.request('data.json').subscribe((res) => { 
     expect(res.text()).toBe('awesome2'); 
    }); 
    })); 
}); 

這個測試應該會失敗,obviouly真棒不等於awesome2,爲什麼不工作?

+0

是你能解決這個問題?我有類似的問題。如果已經按照@ peeskillet的建議嘗試過使用異步,但這對我也不起作用。 –

+0

用'async()'函數包裝整個測試用例。請參閱角度測試異步功能的文檔。 – Serginho

回答

1

這是因爲it方法在異步回調之前完成執行。在香草茉莉花,你會處理異步與done

it('', function (done) { 
    setTimeout(function() { 
    expect(2).toBe(2); 
    done(); 
    }, 1000); 
}); 

done是茉莉花是如何知道我們完成了所有的異步事件,並完成測試。

有了Angular而不是明確地調用done,我們應該在async的資金。這將把整個方法包裝在一個區域中,在那裏它跟蹤所有的異步調用。當所有的異步調用完成後,測試完成。這是從同步測試,一旦方法完成,其中不同,測試完成

import { async } from '@angular/core/testing';     

        // async wapper 
it('should get blogs', async(inject([Http, MockBackend], (http:Http, backend:MockBackend) => { 
    let connection:MockConnection; 
    backend.connections.subscribe(connection => 
    connection.mockRespond(new Response(new ResponseOptions('awesome'))) 
); 
    http.request('data.json').subscribe((res) => { 
    expect(res.text()).toBe('awesome2'); 
    }); 
}))); 

還有fakeAsync,它允許您控制「滴答」

it('should get blogs', fakeAsync(inject([Http, MockBackend], (http:Http, backend:MockBackend) => { 
    let connection:MockConnection; 
    backend.connections.subscribe(connection => 
    connection.mockRespond(new Response(new ResponseOptions('awesome'))) 
); 
    let text; 
    http.request('data.json').subscribe((res) => { 
    text = res.text(); 
    }); 
    tick(); 
    expect(res.text()).toBe('awesome2'); 
})));