2011-10-02 184 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