2013-05-02 36 views

回答

0

當您使用Jasmine測試時,角仿真提供了模擬的$ httpBackend,但實際的$ httpBackend仍然存在。您只需在提供服務時告訴提供商使用原件。它看起來像這樣在您的測試:

var original_http_backend = null; 
angular.module('ng').config(['$httpBackendProvider', function($httpBackendProvider) { 
    original_http_backend = $httpBackendProvider; 
}]); 

beforeEach(module(function($provide) { 
    $provide.provider('$httpBackend', original_http_backend) 
})); 

另外值得指出的是,這種做法,一般,是測試您的前端代碼一個糟糕的方式。這是因爲它增加了一個後端依賴項,所以你不能隔離你的前端行爲。最好嘲笑響應和測試。

雖然我確實使用了這個特性,因爲我們的模擬響應是在後端開發的,以便在那裏進行測試,並且我不想重複這些對象。這種方法允許我使用它們。

+0

到現在爲止,我已經使用了一種不同的技巧,但你的答案會做。 – 2014-01-30 13:13:20

0

如果您確實需要測試異步操作,那麼您可以使用Jasmine Async Support。它基本上包括與waitsFor一起創建runs()塊。一個簡單的例子:

var $http, returned; 

it('should evaluate real XHR request', function() { 
    // this will probably reside in your controller 
    $http.$get('/foo.json').success(function(data) { returned = data; }); 

    waitsFor(function() { 
    return !!returned; 
    }, 'The $http didnt resolved in 1 second', 1000); 

    runs(function() { 
    expect(returned).toBe('The value you expect to be returned'); 
    }); 
}); 

每個runs塊將按照指定的順序運行,而當waitsFor發生時,運行阻塞會等到前waitsFor決心true運行。

+1

我也試過這個。我的問題是,根本沒有執行實際的http請求。如果我在Jasmine測試中使用JQuery來創建http請求,那麼所有的工作都很好。這可能與我假設的角度有關。 – 2013-05-06 18:13:05