2

我有角與UI的路由器,所以toResolve變量將在我的SomeController測試角度解決方法

.state('some.state', { 
     url: '/some', 
     controller: 'SomeController', 
     templateUrl: '/static/views/some-state.html', 
     resolve: { 
     toResolve: function(Resource) { 
      return Resource.get(function(response) { 
      return response; 
      }); 
     }, 

內解決,但如何測試茉莉這個功能?假設我忘記return聲明,因此我範圍內的toResolve將是undefined

+0

爲什麼要測試內部AngularJS功能,可能它的工作原理以完美的方式 –

+0

這不是內部,它是一個簡單的測試用例,例如'expect($ scope.toResolve).not.toBeUndefined();'當我可能想要返回例如 –

+0

@KrzysztofSafjanowski:無論如何,一切都必須可測試如果我想我應該能夠模擬任何組件並測試任何組合那些無論內在與否 –

回答

1

使用服務使解析器可以有效地測試(也可以在集成/ e2e測試中進行模擬)。

注意:角度服務是單例,狀態/路由解析器不是。

如果預計緩存解決方案,解析器可能會被移動到factory服務。

app.factory('someResolver', function(Resource) { 
    return Resource.get(function(response) { 
    return response; 
    }) 
}); 
... 

resolve: { toResolve: 'someResolver' }, 

另一方面,如果預計對每個路徑更改評估解析器,這可能會導致不受歡迎的應用行爲。在這種情況下,適當的配方可能constant註釋功能:

app.constant('someResolver', ['Resource', function(Resource) { 
    return Resource.get(function(response) { 
    return response; 
    }) 
}]); 

app.config(function (someResolver, ...) { 
    ... 
    resolve: { toResolve: someResolver }, 
    ... 

否則規範可能結束與樣板代碼一堆擔保:

var toResolveFactory = $state.get('some.state').resolve.toResolve; 
var toResolve = $injector.invoke(toResolveFactory); 
+0

偉大的,這正是我所期待的。對你來說另一個小問題:我的規範中的$ injector是從哪裏來的? –

+1

@MostWanted你需要在規範中注入'$ injector'服務來測試解析器的'constant'和'$ state.get ...'風格('factory'不需要)。 – estus