2012-01-16 63 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刮擦),並且由於測試引用了'

  • 11. 我可以在webworker中加載AMD模塊嗎?
  • 12. 我可以將JavaScript注入iframe嗎?
  • 13. 我可以在Autofac中註冊我的模塊類型嗎?
  • 14. 我可以像其他庫一樣將JointJS注入AngularJS模塊嗎?
  • 15. ZF2 - 我可以先從`development.config.php`加載模塊嗎?
  • 16. 我可以禁用YUI3模塊的皮膚加載嗎?
  • 17. Apache模塊可以在運行時注入配置嗎?
  • 18. Django-require - 如何在另一個模塊之前加載模塊
  • 19. 如何注入「chart.js之」我的模塊?
  • 20. 在加載Url之前將內容注入到WebView中
  • 21. 可以在加載之前修改lazy fetched字段嗎?
  • 22. 可以在圖像之前加載JS嗎?
  • 23. node-webkit加載模塊失敗
  • 24. 模塊可以下載文件嗎?
  • 25. 你可以在Angular中動態加載模塊嗎?
  • 26. Django Testcase,可以在類/模塊級加載燈具嗎?
  • 27. 是否可以將模塊注入導入模塊的全局變量?
  • 28. 我可以在創建EntityManager之前設置模式嗎?
  • 29. 你可以在Rails模塊中包含過濾器之前/之後嗎?
  • 30. 在加入所有線程之前main()端可以運行嗎?