AngularJS Karma检查url param存在

时间:2018-04-10 06:20:24

标签: angularjs unit-testing karma-jasmine karma-webpack

我是单位测试的新手,并尝试为我的应用编写单元测试。我的路线是:

{
    name: 'details',
    url: '/accounts/company/:companyId',
    controller: 'controllere',
    templateUrl: 'templateurl',
}

我的控制器:

if (!$stateParams.companyId) {
    $scope.promise = $state.go('home');
} else {
    // get company details
}

在我的单元测试中,我需要测试是否" companyId"在URL中出现,然后只有其他人继续重定向到" home"。我试过这段代码,但每次都失败了。我不知道自己做错了什么。

it('should respond to URL with params', function() {
    expect($state.href('/accounts/company/', { companyId: 'test-company' })).toEqual('#/accounts/company/test-company');
});

每次我运行此测试时都会说:预期为等于'#/ accounts / company / test-company'

1 个答案:

答案 0 :(得分:0)

$state.href方法需要stateName,因为在第一个参数后面跟参数需要形成URL并且你已经在其中传递状态URL,这是错误的。

expect(
   $state.href('details', { 
      companyId: 'test-company' 
   })
).toEqual('#/accounts/company/test-company')

我发现您对单元测试此功能的方法有问题,而应该以不同的方式进行测试。就像你应该从测试用例中调用底层方法一样,检查你是否得到了预期的结果。

<强>控制器

function redirect() {
  if (!$stateParams.companyId) {
    $scope.promise = $state.go('home');
  } else {
    // get company details
  }
}
$scope.redirect = redirect;

<强> spec.js

//test pseudo code
describe('should redirect correctly', function(){
   it('should redirect to details page when companyId is passed', function(){
      //arrange
      //TODO: please make sure, you avail useful dependency before using them  
      var $scope = $rootScope.$new(),
          mockParams = { companyId: 1 }
      $controller('myCtrl', {$scope: $scope, $stateParams: mockParams });

      //assert
      $scope.redirect();

      //act
      $scope.$apply(); //apply the changes
      expect($state.current.url).toEqual('#/accounts/company/test-company');

   })
})