【问题标题】:AngularJS - Getting "Argument 'fn' is not a function, got string" when testing a specific controllerAngularJS - 测试特定控制器时获取“参数'fn'不是函数,得到字符串”
【发布时间】:2015-12-21 19:14:00
【问题描述】:

我正在尝试为我的 AngularJS 应用程序进行一些单元测试。我已经制作了几个测试套件,它们都可以工作。但是,在测试某个controller 时,出现以下错误:

Error: [ng:areq] Argument 'fn' is not a function, got string

它的起源似乎在于注入依赖项。这是beforeEach 代码:

beforeEach(function () {
    angular.mock.module('mapInteractions');
    inject(function(_$controller_, _$rootScope_, _$q_) {
        $controller = _$controller_;
        $rootScope = _$rootScope_;
        $q = _$q_;
    }); //<-------- IT BLAMES THIS EXPRESSION
    inject(function(_userProgressService_,
                     _mapMarkersService_,
                     _PointAPlaceController_) {
        //custom services and controllers
        userProgressService = _userProgressService_;
        mapMarkersService = _mapMarkersService_;
        PointAPlaceController = _PointAPlaceController_;
    }); //if I remove the previous inject, it blames this one
    //...
}

我最初使用BardJS's inject method,因为它可以与其他所有套件一起使用,但后来我尝试了,如您所见,错误仍然存​​在。

这真的很奇怪,因为我正在以完全相同的方式测试另一个控制器,但一切都很好。

你能发现有什么不对吗?

【问题讨论】:

    标签: angularjs mocha.js chai


    【解决方案1】:

    听起来您的模拟服务或控制器定义返回的是字符串而不是函数。

    所以问题很可能出在服务定义中,而不是在inject 语句中 - 它只是在尝试注入无效服务时失败。

    检查您的任何模拟服务是否返回一个字符串作为测试值 - Angular 可能将该服务实例作为提供者调用,然后错误地将字符串视为服务定义。

    【讨论】:

    • 抱歉,我不明白...是说我应该检查我的控制器/服务代码还是我的控制器/服务测试代码?因为对于测试,我只需要使用本机服务调用inject,例如$controller,它就会失败。不过,我想我理解你的担忧......我已经通过转到its page 更深入地调查了这个错误,似乎某处有一些未定义的东西......
    • 我认为错误出在mapInteractions 模块中的一项服务的定义中。
    • 你是对的!在定义一些路由时,我错误地声明了一些 module.run() 表达式。每次运行该模块时,它都会抛出异常。遗憾的是它没有更冗长。
    • 很高兴你把它整理好了:)
    猜你喜欢
    • 2014-06-29
    • 2016-11-30
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2013-04-15
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多