【问题标题】:CoffeeScript - Manually declare variableCoffeeScript - 手动声明变量
【发布时间】:2016-04-11 14:53:05
【问题描述】:

问题:是否可以在 CoffeeScript 中手动声明变量

我目前从 CoffeeScript 的单元测试开始,在阅读教程时,我不得不使用 before()after() 函数。虽然您可以在 JavaScript 中声明变量必须在的位置,但您不能在 CoffeeScript afaik 中执行此操作。 一种(但不是最佳实践)解决方案是将它们添加到窗口对象(like this)。我正在使用的代码来自http://sinonjs.org/

这是我正在测试的代码:

describe 'Fake server', ->
  before(() -> server = sinon.fakeServer.create())
  after(() -> server.restore())

  it "calls callback with deserialized data", () ->
    callback = sinon.spy()
    getTodos(42, callback)

  # This is part of the FakeXMLHttpRequest API
  server.requests[0].respond(
    200,
    { "Content-Type": "application/json" },
    JSON.stringify([{ id: 1, text: "Provide examples", done: true }])
  )

  assert(callback.calledOnce)

编译成 JavaScript,before 和 after 函数如下所示:

before(function() {
  var server;
  return server = sinon.fakeServer.create();
});
after(function() {
  return server.restore();
});

如您所见,变量 server 是在 before 函数中声明的,因此不能在 错误 范围之外使用。

【问题讨论】:

  • server.requests[0] 行应该失败,因为此时 server 尚未初始化,不...!?
  • 那是正确的,我似乎没有让它工作,但这是以后的问题,你提到的解决方案在结构之前和之后都可以正常工作(在其他代码上)。正是因为这个失败,我需要在 before() 函数之前初始化 server

标签: javascript unit-testing scope coffeescript


【解决方案1】:
server = undefined  # or null, or false
before -> server = ...
after -> server.restore

虽然在 Javascript 中您可以执行 var foo;,但在 CoffeeScript 中您需要分配 something 来创建变量。但由于var foo; 表示foo 的值为undefined,只需分配undefined 即可产生相同的效果。

【讨论】:

  • 谢谢,这就是我要找的。我确实尝试过 server = null 之前它不起作用。但是有了这个确认,我知道一定是我的代码错了。
猜你喜欢
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多