【问题标题】:Angularjs Jasmine unit testing a controller : $scope and ionicPopupProvider is undefinedAngularjs Jasmine 单元测试控制器:$scope 和 ionicPopupProvider 未定义
【发布时间】:2017-03-22 13:06:15
【问题描述】:

我正在尝试测试我的简单控制器,但似乎没有任何效果。 控制器:

  userCtrlMod.controller('resetCtrl',
  ['$scope', '$ionicPopup', '$timeout','resetPwd',
  function($scope, $ionicPopup, $timeout, resetPwd){

  $scope.reset = function(){
    $scope.resetPopUp = $ionicPopup.show({
     templateUrl:'././templates/popup/reset.html',
     scope: $scope
    });
  }}]);

我的测试文件:

describe("resetCtrl", function () {
var $myScope, $myController,  timeout;

beforeEach(module('dbooks.userCtrl'));

beforeEach(inject(function(
_$controller_,
_$rootScope_,
_$timeout_,
$ionicPopup
){
  $myController = _$controller_;
  $myScope = _$rootScope_;

  $myController = $controller('resetCtrl' , {
    $scope: $myScope,
    $resetPopUp : $ionicPopup
  });
}));

it("should have a $scope variable", function() {
    //console.log($myScope);
    expect($myScope).toBeDefined();
});});

我用谷歌搜索了它,但我找不到任何解决方案,请有人告诉我我做错了什么。 错误:

未捕获的错误:[$injector:unpr] 未知提供者:$ionicPopupProvider

未捕获 预期未定义的未定义。 在对象处。

【问题讨论】:

  • 能否提供完整的代码?
  • 这就是与我正在尝试做的测试相关的所有内容
  • 我能给你举个例子吗,比如简单的两个数字加一
  • 谢谢你,我已经在谷歌找到了很多例子,就像你提到的那样,但我的问题是我认为我错过了一些东西,因为我的范围没有定义

标签: angularjs unit-testing scope controller jasmine


【解决方案1】:

在测试中创建控制器时,您没有提供所有必需的依赖项。您必须提供控制器所需的所有依赖项:

describe("resetCtrl", function () {
    var $myScope, $myController,  timeout;

    beforeEach(module('dbooks.userCtrl'));

    beforeEach(inject(function(
        _$controller_,
        _$rootScope_,
        _$timeout_,
        $ionicPopup
    ){
        $myController = _$controller_;
        $myScope = _$rootScope_;
        var resetPwd = {
            someResetmethod: jasmine.createSpy('rese')
        };

        $myController = $controller('resetCtrl' , {
            $scope: $myScope,
            $ionicPopup: $ionicPopup,
            $timeout: _$timeout_,
            resetPwd: resetPwd 
        });
    }));

    it("should have a $scope variable", function() {
        //console.log($myScope);
        expect($myScope).toBeDefined();
    });

}

请注意,您可以将模拟对象作为依赖项注入 - 在上面的代码中,而不是原始的 resetPwd 模拟对象与 spy 作为方法被注入。重要的是您必须提供控制器使用的所有依赖项,如果您注入模拟对象,这些对象当然必须包含所需的方法和属性。

【讨论】:

  • 感谢您的回答,但尝试了您告诉我的内容,但我仍然遇到同样的问题,问题甚至是未定义的范围,您认为我在代码中遗漏了什么?就像没有注入一样
  • hmm...在测试中,您初始化名为 dbooks.userCtrl 的模块 - 这是存储在 userCtrlMod 变量中的模块名称吗?
  • @AbirBk 可能还有另一个问题:您必须确保具有$ionicPopup 服务的模块在测试中可用。因此,您还必须初始化定义此服务的模块,否则无法将该服务注入您的测试中,因为 Angular 不知道这一点。所以你必须添加这样的东西:beforeEach(module('nameOfModuleWithIonicPopupService'));
  • 这就是我的模块:userCtrlMod = angular.module('dbooks.userCtrl', ['dbooks.directives']);即使我使用了 userCtrlMod 我也遇到了同样的错误......
  • @AbirBk 请参阅我之前的评论。在测试期间,您还必须初始化包含 $ionicPopup 服务的模块。
【解决方案2】:

请试试这个。

$myScope =__$rootScope_.$new();

【讨论】:

  • 有什么解释吗?
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多