Angular JS-Jasmine如何单元测试$ location.path()。search()?

时间:2015-04-03 10:55:51

标签: angularjs unit-testing jasmine

一直在做一些谷歌搜索,但无法找到我的这个小问题的答案。只是试图从我的控制器测试这段代码:

$scope.viewClientAssets = (id) -> 
  $location.path("/assets").search("client_id", "#{id}") 

反过来又返回此网址:

  

http://localhost:3000/admin#/assets?client_id=19

这一切都可以正常但是在进行单元测试时......一些假设: 我的规范设置正确,因为我有其他测试和期望工作完全正常,所以这是测试:

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);
      };

该路径未定义?

任何想法?

2 个答案:

答案 0 :(得分:4)

要测试spyOn,要进行搜索,请执行以下操作

java

这将正确返回值。

答案 1 :(得分:2)

你正在监视$location.path并且没有返回任何内容,或者返回未定义的内容。

让你的间谍返回一个字符串(你通常期望的字符串,实际路径)和为javascript中的所有字符串定义的搜索功能,将在你的测试中正常工作。

e.g。请执行以下操作:

spyOn($location, 'path').and.returnValue('/client_id/')
$location.path('anything'); // returns '/client_id/'