【问题标题】:Jasmine and node.jsJasmine 和 node.js
【发布时间】:2011-10-02 09:54:12
【问题描述】:

有一些Jasmine+Rhino 组合来测试javascript 代码并尝试转移到node.js。但是,在网上找不到任何设置说明(但只有this 链接,说明几乎为零)。任何有关如何使其成为现实(在 Ubuntu 上)的帮助将不胜感激。

【问题讨论】:

    标签: javascript testing node.js jasmine


    【解决方案1】:

    当我第一次尝试使用 jasmine-node 时,我也有同样的想法(关于文档)。然而,事实证明,几乎没有什么需要设置的——它就像 RSpec 或您可能习惯使用的其他测试工具一样工作。要将 Jasmine 用于您的 Node 项目,请执行以下操作:

    1. 确保已安装 jasmine-node 并且您可以运行其可执行文件。
    2. 写下你的规格!我在这些步骤下方有一个示例规范。
    3. 使用命令jasmine-node specs/ 运行您的规范(其中specs/ 指向您的规范所在的目录)。

    就是这样!您可能会发现使用某种构建工具很有用,例如用于 CoffeeScript 的 cakejake

    这是我最近使用 jasmine-node 的一个小项目的部分规范的快速示例;很抱歉它在 CoffeeScript 中。 (顺便说一句:要根据 CoffeeScript 规范运行 jasmine-node,请将 --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)
    

    [编辑]

    您还可以在specs/ 目录的根目录中添加一个spec_helper 文件(具有适合您项目的扩展名)。这是我的内容,它为 Jasmine 添加了一个新的匹配器:

    jasmine = require('jasmine-node')
    
    beforeEach ->
     this.addMatchers
       toInclude: (should_include) ->
         for value in @actual
           return true if value == should_include
         false
    

    【讨论】:

    • 迷人!请再澄清一下:如果我的 javascript 代码应该在浏览器中运行(DOM 模型等),那么我是否需要对 jasmine-node 进行任何添加(比如Zombie.js:zombie.labnotes.org)?
    • @BreakPhreak 这取决于你的测试。如果您的测试代码依赖在 DOM 上,那么您将需要为节点包含一个 DOM 库(如 Zombie.js)。然而,大多数项目使用 DOM,但并不专注于 DOM。在这种情况下,您可以模块化您的代码,以便将 DOM 操作与您要测试的功能分开,并且只测试 jasmine 规范中的非 DOM 功能。使用 jasmine 间谍来存根/模拟 DOM 特定功能也是合适的,这样在通过 jasmine-node 运行时不需要 DOM 支持(可以认为是最佳实践)
    • @Sukima:谢谢!我的代码实际上非常密集地使用了 DOM(并且必须干净地在指纹下使用它)
    • @BreakPhreak 那里有 dom 测试库。在您的情况下,将 DOM 库添加到您的节点测试中是合适的。如果你喜欢 jQuery,你可能会发现 jasmine-jquery 很有用。
    • @BreakPhreak 那里有 dom 测试库。在您的情况下,将 DOM 库添加到您的节点测试中是合适的。如果你喜欢 jQuery,你可能会发现 jasmine-jquery 很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2012-02-19
    • 2016-12-23
    • 2015-03-22
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多