如何在coffeescript的特定范围声明一个variables?

我正在尝试在使用beforeEach块的coffeescript中编写一个茉莉花testing。 这会导致coffeescriptvariables范围的问题。 这是我想要写的:

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块中。 我可以通过初始化来强制variables在正确的范围内声明,但是这看起来很奇怪:

 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写得更简洁吗?

你正在做正确的方法。

这在CoffeeScript文档中有描述。 我不会担心它创build的JS。 是的,如果你自己写这个东西有点麻烦,但是当你使用像CoffeeScript这样的重写器时,这是你必须忍受的事情之一。

但是,您可以select一些相当不错的选项。

如果你愿意的话,你可以把variables放在当前的上下文中(这恰好就是你的茉莉花.Spec对象,好奇,所以它是一个相对安全和适当的地方,把variables…只是不覆盖现有的变数上下文 。):

 describe 'PhoneDetailCtrl', () -> beforeEach () -> @scope = angular.scope() @$browser = @scope.$service('$browser') it 'should fetch phone detail', () -> @scope.params = {phoneId:'xyz'} #... etc 

你也可以设置你自己的variables来存储事物

 describe 'PhoneDetailCtrl', () -> setup = {} beforeEach () -> setup.scope = angular.scope() setup.$browser = setup.scope.$service('$browser') it 'should fetch phone detail', () -> setup.scope.params = {phoneId:'xyz'} #... etc 

你的testing可以写成如下forms:

 describe "MyGame", -> mygame = null beforeEach inject (_MyGame_) -> mygame = _MyGame_ it "should have two players", -> expect(mygame.opponents.length).toEqual 2 

更清晰的语法 – 不需要使事物全球化。

Interesting Posts