gpt4 book ai didi

angularjs - 尝试在 Jasmine 单元测试中使用 $provide 时出错

转载 作者:行者123 更新时间:2023-12-04 05:18:13 26 4
gpt4 key购买 nike

我正在使用 AngularJS 并尝试测试一个调用工厂以获取一些数据的 Controller 。

这是 Controller 代码:

'use strict'

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

$scope.someOtherVariable = {}

自然,我想用模拟交换工厂以防止调用真正的 API。我正在尝试使用 $provide.factory 注入(inject)模拟副本:
'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

用 Karma 运行这个测试时,我猜这个错误:
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 .$provide)显示我应该调用 factory() 方法为 factory(name, $getFn) 其中 name 是一个字符串,$getFn 是一个函数。这就是我正在做的,但它不起作用。

我错过了什么?有谁知道如何在 Jasmine 单元测试中正确使用 $provide ?

谢谢

更新:
我在这里找到了一个类似的 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=preview

现在我手动将 JS 代码转换为 Coffee:plnkr.co/edit/qGGMayFjJoeYZyFKPjuR?p=preview
错误又回来了,所以咖啡代码错误,但 js 代码有效。

最佳答案

找到了我的问题的答案。

由于 CoffeeScript 总是返回最后一条语句的结果,在这种情况下,CoffeeScript 在 module() 内部返回 $provide,这是错误的。解决这个问题的一种简单方法是在 $provide 之后手动添加一个 return 语句,如下所示:

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

希望这会帮助别人。

关于angularjs - 尝试在 Jasmine 单元测试中使用 $provide 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21298414/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com