尝试在茉莉花单元测试中使用$提供时出错

Bla*_*aiz 8 unit-testing coffeescript angularjs

我正在使用AngularJS并尝试测试一个调用工厂来获取一些数据的控制器.

这是控制器代码:

'use strict'

angular.module('AngularApp')
  .controller 'IndexCtrl', ($scope, session, navigation) ->
    session.find().then (response) ->
      $scope.session = response.data

    $scope.someOtherVariable = {}
Run Code Online (Sandbox Code Playgroud)

当然,我想用模拟交换工厂,以防止调用真正的API.我正在尝试使用$ provide.factory来注入模拟副本:

'use strict'

describe 'Controller: IndexCtrl', ->

  # load the controller's module
  beforeEach module 'mosaicAdminWebClientApp'
  beforeEach module ($provide) ->
    $provide.factory 'session', ->
      true

  IndexCtrl = {}
  scope = {}

  # Initialize the controller and a mock scope
  beforeEach inject ($controller, $rootScope) ->
    scope = $rootScope.$new()
    IndexCtrl = $controller 'IndexCtrl', {
      $scope: scope
    }

  it 'should attach a list of awesomeThings to the scope', ->
    expect(true).toBe true
Run Code Online (Sandbox Code Playgroud)

当用Karma运行此测试时,我想这个错误:

Chrome 32.0.1700 (Mac OS X 10.9.1) Controller: IndexCtrl should attach a list of awesomeThings to the scope FAILED
    Error: [ng:areq] Argument 'fn' is not a function, got Object
    http://errors.angularjs.org/1.2.10-build.2176+sha.e020916/ng/areq?p0=fn&p1=not%20a%20function%2C%20got%20Object
        at /Users/blaiz/Documents/some_angular_app/app/bower_components/angular/angular.js:78:12
        at assertArg (/Users/blaiz/Documents/some_angular_app/app/bower_components/angular/angular.js:1363:11)
        at assertArgFn (/Users/blaiz/Documents/some_angular_app/app/bower_components/angular/angular.js:1373:3)
        at annotate (/Users/blaiz/Documents/some_angular_app/app/bower_components/angular/angular.js:3019:5)
        at Object.invoke (/Users/blaiz/Documents/some_angular_app/app/bower_components/angular/angular.js:3685:21)
        at /Users/blaiz/Documents/some_angular_app/app/bower_components/angular/angular.js:3554:71
        at Array.forEach (native)
        at forEach (/Users/blaiz/Documents/some_angular_app/app/bower_components/angular/angular.js:303:11)
        at Object.createInjector [as injector] (/Users/blaiz/Documents/some_angular_app/app/bower_components/angular/angular.js:3554:3)
        at workFn (/Users/blaiz/Documents/some_angular_app/app/bower_components/angular-mocks/angular-mocks.js:2144:52)
Chrome 32.0.1700 (Mac OS X 10.9.1): Executed 10 of 10 (1 FAILED) (0.26 secs / 0.068 secs)
Warning: Task "karma:unit" failed. Use --force to continue.

Aborted due to warnings.
Run Code Online (Sandbox Code Playgroud)

我已经尝试了许多不同的排列,例如删除标签,传递对象或简单值而不是函数,但它们都没有工作.

文档(http://docs.angularjs.org/api/AUTO.$ provide)显示我应该使用工厂(name,$ getFn)调用factory()方法,其中name是一个字符串,$ getFn是一个函数.这就是我正在做的但它不起作用.

我错过了什么?有谁知道如何在Jasmine单元测试中正确使用$ provide?

谢谢

更新:我找到一个类似的plunkr解决了类似这里的问题:stackoverflow.com/questions/19297258/why-is-provide-only-available-in-the-angular-mock-module-function-and-q -onl

我使用这段代码创建了自己的plunkr,但使用JS中的测试代码代替Coffee并使其工作:plnkr.co/edit/gfBzMXpKdJgPKnoyJy5A?p=preview

现在我手动将JS代码转换为Coffee:plnkr.co/edit/qGGMayFjJoeYZyFKPjuR?p=preview错误返回,因此咖啡代码错误但js代码有效.

Bla*_*aiz 18

找到了我的问题的答案.

由于CoffeeScript总是从最后一个语句返回结果,在这种情况下,CoffeeScript在module()内部返回$ provide,这是错误的.一个简单的解决方法是在$ provide之后手动添加一个return语句,如下所示:

  beforeEach module 'mosaicAdminWebClientApp', ($provide) ->
    $provide.service 'session', ()->
    return
Run Code Online (Sandbox Code Playgroud)

希望能帮助别人.