2012-08-26 21 views
2

我對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()函數。

什麼我不明白,雖然,這就是爲什麼它是如何做的渲染()函數調用的斷言。這似乎是一種完全不同的測試方法,因爲我習慣於設置數據,根據預期值測試數據,並將數據撕掉。在這裏,似乎「建立數據」(創建一個模擬res對象)的一部分正在作出斷言。

任何人都可以解釋這一點與Rspec流利的人嗎?

回答

2

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' 

不這種幫助?

+0

很好的迴應。感謝你解釋這個,所以我可以理解,尤其是'更長'的語法示例。 – Feech