如何在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
更清晰的语法 – 不需要使事物全球化。