一直在做一些谷歌搜索,但无法找到我的这个小问题的答案。只是试图从我的控制器测试这段代码:
$scope.viewClientAssets = (id) ->
$location.path("/assets").search("client_id", "#{id}")
反过来又返回此网址:
这一切都可以正常但是在进行单元测试时......一些假设: 我的规范设置正确,因为我有其他测试和期望工作完全正常,所以这是测试:
it 'checks if view client assets path is correct', ->
createController()
#gets rid of unnecessary function calls
flushRequests()
#calls the ctrl function with necessary args
$scope.viewClientAssets(clientData.client.id)
spyOn($location, 'path')
spyOn($location, 'search') #tried diff methods here such as
# and.returnValue(), .calls.any(), calls.all()
expect($location.path).toHaveBeenCalledWith("/assets")
expect($location.path.search).toHaveBeenCalled()
所有其他测试都通过但是当它被击中时我得到以下错误:
TypeError:无法读取未定义的属性“搜索”
控制台调试器告诉我:
$scope.createClientAsset = function(id) {
return $location.path('/assets/create').search("client_id", "" + id);
};
该路径未定义?
任何想法?
答案 0 :(得分:4)
要测试spyOn,要进行搜索,请执行以下操作
java
这将正确返回值。
答案 1 :(得分:2)
你正在监视$location.path
并且没有返回任何内容,或者返回未定义的内容。
让你的间谍返回一个字符串(你通常期望的字符串,实际路径)和为javascript中的所有字符串定义的搜索功能,将在你的测试中正常工作。
e.g。请执行以下操作:
spyOn($location, 'path').and.returnValue('/client_id/')
$location.path('anything'); // returns '/client_id/'