我正在尝试以角度测试异步方法。这是来自我的控制器的代码:
if $routeParams.mode == "new"
# some stuff
mySvc.GetMyStuff $routeParams.id
.then (stuff) ->
if stuff? and stuff.length > 1
# do more stuff
else
$scope.stuff = 'foo'
我的测试:
describe "test stuff",
$q = {}
$scope = {}
controller = {}
mySvc = {}
beforeEach inject ($controller, $rootScope, _$q_, _$routeParams_, _mySvc_)
$q = _$q_
$routeParams: _$routeParams_
$scope = $rootScope.$new()
myCtrl = $controller('MyCtrl',{
$scope:$scope
$routeParams: {mode: "new"}
})
# create a promise to be resolved
d = $q.defer()
d.resolve 'foo' # resolving with an empty array to test 'no results' condition
spyOn(mySvc,'GetMyStuff').and.returnValue d.promise
# later
it "should set stuff to an 'foo'", () ->
mySvc.GetMyStuff "id"
$scope.$apply()
expect($scope.stuff).toBe 'foo' # Expected undefined to be 'foo'
我也尝试从$scope.$apply()
块调用beforeEach
,并尝试使用简单的字符串而不是空数组。我期望异步操作返回的数据等于一个空数组,这应该触发将$stuff
设置为'foo'
的条件。似乎没有使用我已解析的值调用.then
。
编辑:添加了一些丢失的代码,以便示例更清晰。