我根据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而且测试失败。
答案 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');