2012-01-16 89 views
1

我正在編寫一個針對瀏覽器的應用程序,並且我想爲我的庫代碼編寫自動化測試。我希望在諸如Node之類的命令行環境中在瀏覽器之外運行這些測試。我還沒有選擇測試框架,雖然我傾向於像BDD框架MochaJasmine我可以在加載之前將globals注入Node模塊嗎?

我的代碼依賴於Knockout的可觀察屬性。不幸的是,Knockout庫不僅包含可觀察的屬性,還包含將它們綁定到DOM的代碼。因此,如果我只是嘗試從節點require() Knockout庫,我會收到錯誤,因爲庫試圖引用在節點中未定義的windownavigatordocument變量。 Knockout實際上並不使用任何這些變量很多 - 它主要是對DOM綁定進行一些功能檢測,這對我無關緊要 - 但是因爲它確實使用了它們,所以Node甚至不會加載文件。

所以這裏是我的問題:我可以在模塊加載時注入虛擬變量嗎?我可以做些什麼來說:「加載源文件之後,但在開始運行之前,讓我在模塊中設置一些變量,以便代碼能夠成功運行」?

我知道CoffeeScript已修補節點的模塊加載器,因此它可以裝載除了.js.coffee文件;所以它似乎也可能有一些方法來修補它以注入變量,如果我只知道如何。

回答

2

是的,是的,你可以 - 創建它們然後使用它們,全局變量沒有隔離。或者,您可能希望在代碼中以文本方式封裝墊片,並在閉包內提供它們。 jsdom做這樣的事情來運行jQuery。 (並且它提供了一個真正的DOM!)

+1

D'哦!你是對的,在JavaScript中,我可以做一些像'window = {};'之類的東西,然後在Knockout上調用'require()'。但是我使用的是CoffeeScript,默認情況下,它將所有內容都包裝在一個匿名函數中,所以全局變量不會出血,所以我必須設置'global.window'。一旦我知道有什麼需要尋找的東西,不難發現 - 感謝您指引我朝着正確的方向發展。 (並感謝您指出jsdom - 這可能也會幫助我!) – 2012-01-16 04:34:22

0

Node.js不是一個「無頭」環境,它通常使用的意義上(無頭瀏覽器)。

jsdom可以帶你進一步,但你應該看看PhantomJS,這是無頭webkit,DOM和所有,並應完美適合你的用例。

+0

我已經看了一下PhantomJS,但它的測試運行器支持似乎笨重(DOM刮擦),並且由於測試引用了'