2011-10-02 20 views
18

Avere qualche combo Jasmine+Rhino per testare il codice javascript e provare a passare a node.js. Tuttavia, non è stato possibile trovare alcuna istruzione di configurazione in rete (ma solo il collegamento this, con istruzioni quasi zero). Qualsiasi aiuto su come renderlo vero (su Ubuntu) sarà molto apprezzato.Jasmine e node.js

risposta

28

Ho pensato la stessa cosa (riguardo alla documentazione) quando ho provato ad usare il nodo di gelsomino. A quanto pare, però, non c'è praticamente nulla da configurare: funziona esattamente come RSpec o altri strumenti di test a cui potresti essere abituato. Per utilizzare Jasmine con il progetto Nodo, effettuare le seguenti operazioni:

  1. Assicurati jasmine-node sia installato e che è possibile eseguire il suo eseguibile.
  2. Scrivi le tue specifiche! Ho una specifica di esempio sotto questi passaggi.
  3. Eseguire le specifiche con il comando jasmine-node specs/ (dove specs/ punta alla directory con le specifiche).

Questo è tutto! Potresti trovare utile utilizzare alcuni strumenti di compilazione come cake per CoffeeScript o jake.

Ecco un breve esempio di parte di una specifica di un piccolo progetto che ho utilizzato recentemente sul nodo del gelsomino; mi scuso che è in CoffeeScript. (Per inciso: per eseguire il gelsomino nodi contro specifiche CoffeeScript, passare l'opzione --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) 

[Edit]

È possibile anche aggiungere un file spec_helper (con l'estensione appropriata per il vostro progetto) nella radice della directory specs/. Ecco il mio contenuto, che aggiunge un nuovo matcher a Jasmine:

jasmine = require('jasmine-node') 

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

affascinante! solo un altro chiarimento per favore: se il mio codice javascript dovrebbe funzionare nel browser (modello DOM ecc.), allora ho bisogno di qualche aggiunta al nodo jasmine (ad esempio 'Zombie.js': http://zombie.labnotes.org/)? – BreakPhreak

+2

@BreakPhreak Dipende da cosa testate. Se il tuo codice di prova ** dipende ** sul DOM, dovrai includere una libreria DOM per il nodo (come Zombie.js). Tuttavia, la maggior parte dei progetti utilizza il DOM ma non si concentra sul DOM. In questo caso puoi modulare il tuo codice in modo da avere le manipolazioni del DOM separate dalle funzioni che vuoi testare e testare solo le funzionalità non DOM nelle specifiche jasmine. È anche opportuno usare le spie del gelsomino per stubare/deridere le funzioni specifiche del DOM in modo che non sia necessario alcun supporto DOM quando si esegue tramite nodo jasmine (potrebbe essere considerata la migliore pratica) – Sukima

+0

@Sukima: grazie! il mio codice effettivamente usa il DOM molto intensamente (e deve averlo pulito sotto le impronte digitali) – BreakPhreak