Angularjs AngularUI模态控制器单元测试中未找到模拟函数

Angularjs AngularUI模态控制器单元测试中未找到模拟函数,angularjs,unit-testing,jasmine,angular-bootstrap,Angularjs,Unit Testing,Jasmine,Angular Bootstrap,我使用modals,有这样一个基本控制器: .controller('DashboardHelpController', ['$scope', '$uibModal', function ($scope, $uibModal) { var dhc = this; dhc.open = function (size, resource) { var modalInstance = $uibModal.open({ templateUrl:

我使用modals,有这样一个基本控制器:

.controller('DashboardHelpController', ['$scope', '$uibModal', function ($scope, $uibModal) {

    var dhc = this;

    dhc.open = function (size, resource) {
        var modalInstance = $uibModal.open({
            templateUrl: 'resourcePlayModal.html',
            controller: 'ModalInstanceCtrl as mic',
            size: size,
            resolve: {
                resource: function () {
                    return resource;
                }
            }
        });
    };
}])
它调用标准模态实例控制器:

.controller('ModalInstanceCtrl', ['$uibModalInstance', 'resource', function ($uibModalInstance, resource) {
    this.resource = resource;

    this.cancel = function () {
        $uibModalInstance.dismiss();
    };
}])
下面是我的单元测试,模仿:

问题是在作用域上找不到取消功能:

预期spy modalInstance.Disclose已通过['cancel'调用 ]但从来没有人打过电话

更新:我最初尝试调用
cancel
作为函数:

it('should have called the modal dismiss function', function () {
    scope.cancel();
    expect(modalInstance.dismiss).toHaveBeenCalled();
});
那没用。我上面的代码试图解决原始问题:

TypeError:scope.cancel不是一个函数


在我使用
控制器作为
语法时,事情有点复杂,但这应该是可行的。谢谢您的帮助。

作用域。cancel
是一个函数,但您并没有这样调用它

it('should have called the modal dismiss function', function () {
    scope.cancel();
    expect(modalInstance.dismiss).toHaveBeenCalledWith();
});
此外,
scope.cancel()
从未在
DashboardHelpController
上定义,即使这是您为测试创建的范围。您需要在仪表板控制器上创建一个方法,该方法在创建modalInstance后调用模态实例close方法

var modalInstance = $uibModal.open({
...
dhc.cancel = function ()  {
    modalInstance.dismiss();
}

scope.cancel
是一个函数,但您并没有这样调用它

it('should have called the modal dismiss function', function () {
    scope.cancel();
    expect(modalInstance.dismiss).toHaveBeenCalledWith();
});
此外,
scope.cancel()
从未在
DashboardHelpController
上定义,即使这是您为测试创建的范围。您需要在仪表板控制器上创建一个方法,该方法在创建modalInstance后调用模态实例close方法

var modalInstance = $uibModal.open({
...
dhc.cancel = function ()  {
    modalInstance.dismiss();
}

取消是一项功能<代码>范围。取消不调用它。即使有括号,cancel()也是ModalInstanceCtrl的函数,您永远不会在任何地方实例化它,也不会是$scope的函数。请看我的更新<代码>取消()是实例控制器的一个功能。我的问题在于我无法通过各种控制器和函数跟踪作用域。我不知道你为什么关心作用域,因为这两个控制器都没有使用它。为什么要在DashboardHelpController的测试中尝试测试cancel(),这是ModalInstanceCtrl的一个函数?所谓作用域,我指的是被模拟的对象。问得好。我可能已经让自己在测试模态的各种尝试中有点扭曲了。您将如何测试模态的功能?我没有接受/拒绝类型的函数,只有一个视频播放模式。这里没有太多测试。首先应避免使用未定义的全局变量,如
resource
。唯一可以测试的是dhc.open使用预期参数调用$uibModal.open(),而ModalInstanceCtrl.cancel()调用$uibModalInstance上的dismise()。但是这样的单元测试并没有多大价值<代码>范围。取消不调用它。即使有括号,cancel()也是ModalInstanceCtrl的函数,您永远不会在任何地方实例化它,也不会是$scope的函数。请看我的更新<代码>取消()是实例控制器的一个功能。我的问题在于我无法通过各种控制器和函数跟踪作用域。我不知道你为什么关心作用域,因为这两个控制器都没有使用它。为什么要在DashboardHelpController的测试中尝试测试cancel(),这是ModalInstanceCtrl的一个函数?所谓作用域,我指的是被模拟的对象。问得好。我可能已经让自己在测试模态的各种尝试中有点扭曲了。您将如何测试模态的功能?我没有接受/拒绝类型的函数,只有一个视频播放模式。这里没有太多测试。首先应避免使用未定义的全局变量,如
resource
。唯一可以测试的是dhc.open使用预期参数调用$uibModal.open(),而ModalInstanceCtrl.cancel()调用$uibModalInstance上的dismise()。但这样的单元测试并没有多大价值。@CodeMed我已经为您的问题添加了答案。@CodeMed我已经为您的问题添加了答案。