【发布时间】:2014-11-22 01:43:53
【问题描述】:
这类问题可能太多了,但我没有找到一个好的解决方案。 在我看来,这个问题应该太普遍了。 脏伪代码: 控制器
app.controller('Acontroller',function($scope,$q, Aservice){
$scope.someScopeVariable = null;
function refresh(){
$q.all([
Aservice.getCollectionA().then(function(results){
return $scope.collectionA = results}),
Aservice.getCollectionB().then(function(results){
return $scope.collectionB = results})
]);
};
$scope.someScopeFunction = function(){
Aservice.someServerUpdateCall().then(function(){
refresh().then(function(){
$scope.someScopeVariable = 'woot'
}
}
}
})
这真的只是写得很糟糕吗?我正在撕掉我光头上剩余的胡茬,试图测试 someScopeFunction。
你会如何测试这个? (Karma 上的 Jasmine (1.3))
我可以测试第一层的承诺,但我不能简单地断言刷新函数被调用。我可以模拟该服务,但我很难窥探该刷新功能。我假设我必须实例化控制器(找到了一个类似的解决方案),尽管这看起来有点疯狂。
所以(请原谅咖啡脚本):
describe 'Acontroller', ->
mockService = {}
aResponseObject =
a:1
b:2
beforeEach -> module('app')
beforeEach inject ($controller,$q, $rootScope) ->
emptyPromise = ->
defer = $q.defer
defer.resolve()
defer.promise
responsePromise = ->
defer = $q.defer()
defer.resolve([aResponseObject],[aResponseObject])
defer.promise
mockService.getCollectionA = jasmine.createSpy('getCollectionA').andReturn responsePromise()
mockService.getCollectionB = jasmine.createSpy('getCollectionB').andReturn responsePromise()
mockService.someServerUpdateCall = jasmine.createSpy('someServerUpdateCall').andReturn emptyPromise()
scope = $rootScope.$new()
$controller 'Acontroller',
$scope: scope
Aservice: mockService
$rootScope.$apply ## resolve promises
describe 'someScopeFunction', ->
it 'should call Aservice with someServerUpdateCall', ->
scope.someScopeFunction()
scope.$digest
expect(Aservice.someSererUpdateCall).toHaveBeenCalled() ##this should work
这种预期效果很好,但确认下一次刷新调用是我不知所措的地方。鉴于它与范围无关,我会假设我必须实例化控制器?
我尝试过其他策略,包括:
done = false
refresh = jasmine.createSpy('refresh')
scope.someScopeFunction().then() -> done = true
waitsFor -> done
runs ->
scope.$apply ->
expect(refresh).toHaveBeenCalled()
但无济于事,promise 没有解决。
我听说 Mocha 让异步调用更简单一些,但我真的很害怕重新开始。
【问题讨论】:
标签: angularjs unit-testing karma-jasmine