Я использую 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-код.
Что такое «навигация»? –
Меню навигации приложений. Я положил его на завод, но он не вызывает никаких апи или что-то еще, это просто документ json. Это не важно для этого примера. – Blaiz