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

Angular JS-Jasmine how to unit test $location.path().search()?

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

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

反过来 returns 这个 url:

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: Cannot read property 'search' of undefined

控制台调试器告诉我:

$scope.createClientAsset = function(id) {
        return $location.path('/assets/create').search("client_id", "" + id);
      };

该路径未定义?

有什么想法吗?

您正在监视 $location.path 而不是 return 任何东西,或者 return 未定义。

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

例如操作如下:

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

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

spyOn($location, 'path').and.callThrough();
spyOn($location, 'search');

这将 return 值正确。