2014-01-23 4 views
8

Я использую AngularJS и пытаюсь протестировать контроллер, который вызывает фабрику, чтобы получить некоторые данные.

Это код контроллера:

'use strict' 

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

    $scope.someOtherVariable = {} 

Естественно, я хотел бы поменять на завод с макетом, чтобы предотвратить вызов реального 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 

При выполнении этого теста с Кармой, я предполагаю эту ошибку:

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. 

Я пробовал много различных перестановки, таких как удаление метки, передача объекта или простое значение вместо функции, и ни одна из них не работала.

Документация (http://docs.angularjs.org/api/AUTO. $ Обеспечить) показывает, что я должен вызвать метод factory() с фабрикой (имя, $ getFn), где name - строка, а функция $ getFn - это функция. Это то, что я делаю, но это не работает.

Все, что я пропустил? Кто-нибудь знает, как правильно использовать $ обеспечить в модулях Jasmine?

Благодаря

Обновление: Я нашел 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 = предварительный просмотр

Теперь я вручную преобразовал код JS в Coffee: plnkr.co/edit/qGGMayFjJoeYZyFKPjuR?p=preview T он ошибается, поэтому код кофе неправильный, но работает js-код.

+0

Что такое «навигация»? –

+0

Меню навигации приложений. Я положил его на завод, но он не вызывает никаких апи или что-то еще, это просто документ json. Это не важно для этого примера. – Blaiz

ответ

18

Найден ответ на мой вопрос.

Поскольку CoffeeScript всегда возвращает результат из последнего утверждения, в этом случае CoffeeScript возвращает $ provision внутри модуля(), что неверно. Самый простой способ исправить это просто вручную добавить оператор возврата после $ представить, как это:

beforeEach module 'mosaicAdminWebClientApp', ($provide) -> 
    $provide.service 'session',()-> 
    return 

Надежда, которая поможет кому-то еще.

+0

Борьба с этим почти час. Отличная находка/исправление. Благодаря тонну. – pauljm

+0

Спасибо за это, второй раз в день coffeescript делает это со мной! – Ian

+0

Наверное, в третий раз я вернулся к этому ответу, чтобы помнить, что у меня была эта проблема раньше :) –

Смежные вопросы