如何在服务中测试 $location 和 .search()

How to test $location and .search() in a service

我有一个简单的服务,它有许多方法可以从 URL:

中检索各种值
app.service('urlInterpSrv', function($location) {
    return {
        getCartID : function() {
            return $location.search().getCartID;
        },
        getUserAddress : function() {
            return $location.search().getUserAddress;
        },
        getShippingCountry : function() {
            return $location.search().getShippingCountry;
        },
        getCookie : function() {
            return $location.search().getCookie;
        },
        getUsername : function() {
            return $location.search().getUsername;
        }
    };
});

我在我的控制器中简单地通过以下方式调用它们:

app.controller('ShoppingCartController', function($scope, urlInterpSrv, $rootScope) {

    $scope.getCartID = urlInterpSrv.getCartID();
    $scope.getShippingCountry = urlInterpSrv.getShippingCountry();

});

三个问题?我应该明确测试服务,还是控制器,或两者?

我已经尝试通过以下方式显式测试该服务:

describe('urlInterpSrv', function(){

    var $location;

    beforeEach(module('myApp'));

    beforeEach(inject(function (_urlInterpSrv_, _$location_) {
        this.urlInterpSrv = _urlInterpSrv_;
        $location = _$location_;
    }));


    it('should getCartID from url', function(){
        $location.path('/?getCartID=0087598');
        expect(this.urlInterpSrv.getCartID).toEqual(0087598);
    });

});

但是我收到错误:

Expected Function to equal 87598.

你断言的是函数,而不是它的返回值。尝试:

expect(this.urlInterpSrv.getCartID()).toEqual(0087598);

你可以试试下面吗..你可以先执行函数然后比较结果

it('should getCartID from url', function(){
    $location.path('/?getCartID=0087598');
    var cartId = this.urlInterpSrv.getCartID();
    expect(cartId).toEqual(0087598);
});

$location.path doesn't change 'search' part of url,它改变了 'path' 部分并改为编码 ? 个字符。

应避免使用前导零的数字,因为它们在 JS 中可以是 treated as octals

解析参数值中的基元不是 $location 的工作,getCartID 等于“0087598”字符串,而不是 87598。

it('should getCartID from url', function(){
    $location.url('/?getCartID=0087598');
    expect(this.urlInterpSrv.getCartID()).toEqual('0087598');
});