2

Я написал короткий тестовый пример, основанный на примере с Angular unit-testing documentation. Я пытался создать jsfiddle без везения, поэтому, пожалуйста, несите меня.Undefined не является функцией CoffeeScript/Angular/Jasmine

# 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' 

Когда я запускаю этот тест, я получаю «Ошибка типа: не определено не является функцией» за $ scope.foo и тест не пройден.

ответ

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 

Из примера вы связаны, легко видеть, что вам нужна вторая строка, а не первая.

+3

Brilliant! Вот и все. Я знал, что это должен быть гремлин CoffeeScript. –

2

Ваш

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

в настоящее время transpiled к:

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

Так, JavaScript думает $ scope.foo функция (которая не является). Помните, что пространство в CoffeeScript сигнализирует о том, что вы передаете параметр функции.

Что, кажется, что вы хотите, одно из следующих действий:

expect $scope.foo 
    .toEqual 'foo' 

или

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

Они оба стали:

expect($scope.foo).toEqual('foo'); 
Смежные вопросы