我正在尝试使用Coffeescript编写Jasmine测试,并使用beforeEach块。这会遇到Coffeescript变量作用域的问题。下面是我希望编写的代码:
describe 'PhoneDetailCtrl', () ->
beforeEach () ->
scope = angular.scope()
$browser = scope.$service('$browser')
it 'should fetch phone detail', () ->
scope.params = {phoneId:'xyz'}
$browser.xhr.expectGET('phones/xyz.json').respond({name:'phone xyz'})
ctrl = scope.$new(PhoneDetailCtrl)
expect(ctrl.phone).toEqualData({})
$browser.xhr.flush()
expect(ctrl.phone).toEqualData({name:'phone xyz'})
然而,这种方法不起作用,因为scope
和$browser
将在最内层的作用域中使用var
声明。也就是说,在beforeEach
中声明一次后,在it
块中又声明一次。我可以通过初始化它们来强制在正确的作用域中声明变量,但这似乎非常奇怪:
describe 'PhoneDetailCtrl', () ->
$browser = {}
scope = {}
beforeEach () ->
scope = angular.scope()
$browser = scope.$service('$browser')
it 'should fetch phone detail', () ->
scope.params = {phoneId:'xyz'}
...
这个可以工作,但它编译成的JavaScript实际上是这样的。describe('PhoneListCtrl', function() {
var $browser, ctrl, scope;
$browser = {};
ctrl = {};
scope = {};
我需要的只是这一行代码 var $browser, ctrl, scope;
。我能在CoffeeScript中更加简洁地写吗?