作为练习,我试图将angular-seed
repo中包含的业力单元测试从js转换为咖啡脚本。特别是,我遇到了tests/unit/directivesSpec.js
测试集的问题,该测试集定义了一个简单的价值服务。这是我的咖啡脚本代码:
1 describe 'directives', ->
2 beforeEach module 'myApp.directives'
3
4 describe 'app-version', ->
5 it 'should print current version', ->
6 module ($provide) ->
7 $provide.value 'version', 'TEST_VER'
8 inject ($compile, $rootScope) ->
9 element = $compile('<span app-version></span>')($rootScope)
10 expect(element.text()).toEqual 'TEST_VER'
当咖啡脚本代码围绕第6
行编译时似乎存在问题,因为这会变成:
module(function($provide) {
return $provide.value('version', 'TEST_VER');
});
导致我的测试因错误而失败:
Error: [ng:areq] Argument 'fn' is not a function, got Object
http://errors.angularjs.org/1.2.4/ng/areq?p0=fn&p1=not%20a%20function%2C%20got%20Object
at /Data/src/ngfrontend-seed/app/vendor/angular/angular.js:78:12
at assertArg (/Data/src/ngfrontend-seed/app/vendor/angular/angular.js:1358:11)
at assertArgFn (/Data/src/ngfrontend-seed/app/vendor/angular/angular.js:1368:3)
如果删除return
语句,则测试运行正常。参考example in the documentation,它不能立即清楚模块函数接受什么作为返回值,但return
语句似乎破坏了事情。
关于如何解决这个问题的任何想法,或者在编写测试规范时坚持使用简单的javascript是明智的吗?
答案 0 :(得分:4)
Coffeescript隐式返回每个函数的最后一个表达式 但是你可以像这样添加一个显式的空返回语句:
6 module ($provide) ->
7 $provide.value 'version', 'TEST_VER'
8 return
将编译为:
module(function($provide) {
$provide.value('version', 'TEST_VER'); //without return
});
有关更多信息,请参阅此thread。