2011-10-02 81 views
18

有一定Jasmine+Rhino組合來測試JavaScript代碼,並試圖轉移到node.js。但是,在網上找不到任何設置說明(但只有this鏈接,幾乎爲零的指令)。任何有關如何使它成爲真的幫助(在Ubuntu上)將不勝感激。茉莉花和Node.js的

回答

28

當我第一次嘗試使用茉莉節點時,我認爲同樣的事情(關於文檔)。事實證明,實際上沒有什麼可設置的 - 它的工作原理與RSpec或其他您可能習慣的測試工具一樣。要將Jasmine與Node項目一起使用,請執行以下操作:

  1. 確保已安裝jasmine-node並且您可以運行其可執行文件。
  2. 編寫您的規格!我在這些步驟下面有一個示例規範。
  3. 用命令jasmine-node specs/運行您的規格(其中specs/點與您規格的目錄)。

這就是它!您可能會發現使用某種構建工具是有好處的,例如用於CoffeeScript的cakejake

下面是我最近使用jasmine-node的一個小項目規範的一部分的一個簡單示例;道歉,它在CoffeeScript中。 (順便說一句:在其上運行的CoffeeScript規格茉莉節點,它傳遞--coffee選項。)

Chess = require('../lib/chess') 
Board = Chess.Board 
jasmine = require('jasmine-node') 

describe "A chess board", -> 
    beforeEach -> 
    @board = new Board 

    it "should convert a letter/number position into an array index", -> 
    expect(Board.squares["a1"]).toEqual(0) 
    expect(Board.squares["b1"]).toEqual(1) 
    expect(Board.squares["a2"]).toEqual(16) 
    expect(Board.squares["h8"]).toEqual(119) 

    it "should know if an array index represents a valid square", -> 
    expect(Board.is_valid_square 0).toBeTruthy() 
    expect(Board.is_valid_square 7).toBeTruthy() 
    expect(Board.is_valid_square 8).toBeFalsy() 
    expect(Board.is_valid_square 15).toBeFalsy() 
    expect(Board.is_valid_square 119).toBeTruthy() 
    expect(Board.is_valid_square 120).toBeFalsy() 
    expect(Board.is_valid_square 129).toBeFalsy() 
    expect(Board.is_valid_square -1).toBeFalsy() 

    it "should start off clear", -> 
    for i in [0..127] 
     if Board.is_valid_square(i) 
     expect(@board.piece_on(i)).toBeNull() 

    describe "#place_piece", -> 
    it "should place a piece on the board", -> 
     piece = jasmine.createSpy("piece") 
     @board.place_piece "a1", piece 
     expect(@board.piece_on "a1").toEqual(piece) 

    it "should set the piece's location to the given square's index", -> 
     piece = jasmine.createSpyObj(Piece, ["position"]) 
     @board.place_piece "b5", piece 
     expect(piece.position).toEqual(65) 

[編輯]

您還可以添加一個spec_helper文件(與你的項目適當延長)位於specs/目錄的根目錄。下面是我的內容,它爲茉莉花添加了一個新的匹配器:

jasmine = require('jasmine-node') 

beforeEach -> 
this.addMatchers 
    toInclude: (should_include) -> 
    for value in @actual 
     return true if value == should_include 
    false 
+0

迷人!只是另一個澄清請:如果我的JavaScript代碼應該運行在瀏覽器(DOM模型等),那麼我需要任何額外的茉莉節點(說'Zombie.js':http://zombie.labnotes.org/ )? – BreakPhreak

+2

@BreakPhreak這取決於你的測試。如果您的測試代碼**依賴於**,那麼您將需要爲節點包含一個DOM庫(如Zombie.js)。但是,大多數項目都使用DOM,但不關注DOM。在這種情況下,您可以對代碼進行模塊化,以便將DOM操作與要測試的函數分開,並僅測試茉莉花規範中的非DOM功能。使用茉莉花間諜來存根/模擬DOM特定函數也是適當的,這樣在通過茉莉節點運行時不需要DOM支持(可以認爲是最佳實踐) – Sukima

+0

@Sukima:謝謝!我的代碼實際上非常密集地使用DOM(並且必須在指紋下方乾淨地使用它) – BreakPhreak