未定义的功能不是CoffeeScript / Angular / Jasmine

时间:2015-04-08 15:02:12

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

我根据Angular unit-testing documentation的例子编写了一个简短的单元测试。我试图创造一个没有运气的jsfiddle,所以请耐心等待。

# app definition
app = module 'myApp', []
.controller 'myCtrl', ['$scope', ($scope) ->$scope.foo = 'foo']

# test
describe 'myCtrl tests', () ->
  beforeEach module 'myApp'
  $controller = undefined

  beforeEach inject (_$controller_) ->
    $controller = _$controller_

  describe 'myCtrl', () ->
    it 'should not throw an error', () ->
      $scope = {}
      controller = $controller 'myCtrl',{$scope: $scope}
      expect ($scope.foo).toEqual 'foo'

当我运行此测试时,我得到" TypeError:undefined不是函数" 对于$ scope.foo而且测试失败。

2 个答案:

答案 0 :(得分:2)

考虑以下两行CoffeeScript代码:

expect ($scope.foo).toEqual 'foo'  # line 1
expect($scope.foo).toEqual 'foo'   # line 2

您可能希望这些代码生成相同的JavaScript代码,但它们不会:

expect($scope.foo.toEqual('foo')) // line 1
expect($scope.foo).toEqual('foo') // line 2

从您链接到的示例中,很容易看出您想要的是第二行,而不是前者。

答案 1 :(得分:2)

expect ($scope.foo).toEqual 'foo'

正在被描述为:

expect($scope.foo.toEqual('foo'));

所以,javascript认为$ scope.foo是一个函数(它不是)。请记住,CoffeeScript中的空格表示您将参数传递给函数。

您想要的是以下任何一种:

expect $scope.foo
    .toEqual 'foo'

expect($scope.foo).toEqual 'foo'

这些都将成为:

expect($scope.foo).toEqual('foo');