【问题标题】:Vows: Testing Asynchronous InterleavingVows:测试异步交错
【发布时间】:2011-12-25 03:32:49
【问题描述】:

是否有一种方法可以测试(潜在的)异步函数与誓言的交错?

例如:

// Topic portion
var user = new User('jacob')
user.set('email,'foo@bar.com')
user.save() // a
user.set('email',derp@cherp.com')
user.save() // b
user.refresh(this.callback) // Reload from database

// Callback
assert.equals(user.email,'derp@cherp.com')

两次保存之间可能存在竞争条件。在编写测试时,我想确保我的 API 确保 b 最后完成(并且我们有正确的电子邮件最终值)。按照它的编写方式,测试有时会巧合地通过。

【问题讨论】:

  • save()函数有回调吗?

标签: testing node.js vows


【解决方案1】:

这是誓言文档中的示例:

嵌套上下文充当嵌套回调并将返回参数传递给下一个上下文。

文档:http://vowsjs.org/

{ topic: function () {
    fs.stat('~/FILE', this.callback);
  },
  'after a successful `fs.stat`': {
    topic: function (stat) {
      fs.open('~/FILE', "r", stat.mode, this.callback);
    },
    'after a successful `fs.open`': {
      topic: function (fd, stat) {
        fs.read(fd, stat.size, 0, "utf8", this.callback);
      },
      'we can `fs.read` to get the file contents': function (data) {
        assert.isString (data);
      }
    }
  }
}

【讨论】:

  • 这实际上与我想要的相反。我实际上想测试并确保在不明确强制以同步方式编写测试代码的情况下不会发生竞争条件 - 目标是使 api 透明。但也许这无论如何都违背了节点的本质。要点是,我想在幕后排队 saves()。
  • 这消除了你的竞争条件。通过使用回调消除了不需要的序列时序。我可以发布可能以非顺序方式执行的并行代码。
  • 听起来您想强制服务器纠正客户端代码中的竞争条件,由于客户端和服务器之间的延迟性质,这是不可能的。这是正确的吗?
  • 目前都是服务器端的。目标是能够以一种看起来像同步代码的方式编写命令(没有一个命令会阻塞代码的主题部分,尽管它们必须相互等待完成,例如通过排队让save b 不会' t 运行直到 save a 完成)。希望是获得一些语法糖并使其有点透明。例如。保存操作不会立即向数据库发出请求,而是将该请求排队。如果队列为空,则立即执行,否则延迟执行。
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
相关资源
最近更新 更多