【问题标题】:Understanding Mocha syntax in an 'integration' test在“集成”测试中理解 Mocha 语法
【发布时间】:2012-08-26 18:34:44
【问题描述】:

我在 Ruby 和 Rspec 方面有相当广泛的背景。然而,在我学习 Node 和 Mocha 的过程中,我遇到了一些我似乎无法理解的语法。

this tutorial 为例,测试路由包括以下内容(使用CoffeeScript)。还应该注意的是,我在许多其他地方向初学者解释 Mocha 的以下示例。

require "should"
routes = require "../routes/index"

describe "routes", ->

  describe "index", ->

    it "should display index with posts", ->
      req = null
      res =
        render: (view, vars) ->
          view.should.equal 'index'
          vars.title.should.equal('My Coffeepress Blog')
      routes.index(req, res)

如果我理解正确,这个测试会设置模拟请求和响应变量(分别为 req 和 res)并将它们发送到 routes.index() 函数。

我不明白,但是,它为什么以及如何在 render() 函数调用中进行断言。这似乎是一种完全不同的测试方法,因为我习惯于设置数据,根据预期值测试数据,然后将数据分解。在这里,似乎“设置数据”(创建模拟 res 对象)的一部分正在做出断言。

谁能向精通 Rspec 的人解释这一点?

【问题讨论】:

    标签: node.js testing mocha.js


    【解决方案1】:

    render 函数正在被调用,我想,在你的 index 路由中。它可能看起来像:

    index: (req, res, next) ->
        res.render 'index', { title: 'My Coffeepress Blog'}
    

    您正在传递一个暴露render 方法的存根响应,因此您可以拦截调用并断言调用;即第一个参数(view 参数)和数据(vars 对象)。这就是所有需要的,因为超出此范围当然是测试底层框架。

    对回调进行断言通常会导致看起来“颠倒”的测试,因为代码不读取 top=>down。这是异步/回调世界中的生活。

    如果这很烦人,您可以在局部变量中捕获调用并在事后进行断言,但是一旦您编写了一段时间的回调代码,这就会变得不必要地冗长:

    # snip
    viewName = null
    locals = null
    res: 
        render: (view, vars) > 
            viewName = view
            locals = vars
    routes.index (req, res)
    viewName.should.equal 'index'
    locals.title.should.equal 'My Coffeepress Blog'
    

    这有帮助吗?

    【讨论】:

    • 反响很好。感谢您对此进行解释,以便我理解,尤其是“更长”的语法示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    相关资源
    最近更新 更多