CoffeeScript 实用手册

关于 Ajax 不使用 jQuery 的 Ajax 请求 语法 服务端和客户端的代码重用 比较范围 嵌入 JavaScript For 循环 类和对象 对象的链式调用 类方法和实例方法 类变量和实例变量 克隆对象(深度复制) 类的混合 创建一个不存在的对象字面值 CoffeeScrip 的 type 函数 字符串 大写单词首字母 查找子字符串 生成唯一 ID 字符串插值 把字符串转换为小写形式 匹配字符串 重复字符串 拆分字符串 清理字符串前后的空白符 把字符串转换为大写形式 数组 检查变量的类型是否为数组 将数组连接 由数组创建一个对象词典 由数组创建一个字符串 定义数组范围 筛选数组 列表推导 映射数组 数组最大值 归纳数组 删除数组中的相同元素 反转数组 打乱数组中的元素 检测每个元素 使用数组来交换变量 对象数组 类似 Python 的 zip 函数 日期和时间 计算复活节的日期 计算(美国和加拿大的)感恩节日期 计算两个日期中间的天数 找到一个月中的最后一天 找到上一个月(或下一个月) 计算月球的相位 数学 数学常数 更快的 Fibonacci 算法 平方根倒数快速算法 生成可预测的随机数 生成随机数 转换弧度和度 一个随机整数函数 指数对数运算 方法 去抖动函数 当函数括号不可选 递归函数 提示参数 元编程 检测与构建丢失的函数 扩展内置对象 jQuery 回调绑定 创建 jQuery 插件 正则表达式 使用 Heregexes 使用 HTML 命名实体替换 HTML 标签 替换子字符串 查找子字符串 网络 客户端 HTTP 客户端 基本的 HTTP 服务器 服务器 双向客户端 双向服务器 设计模式 适配器模式 桥接模式 生成器模式 命令模式 修饰模式 工厂方法模式 解释器模式 备忘录模式 观察者模式 单件模式 策略模式 模板方法模式 数据库 MongoDB SQLite 测试 使用 Jasmine 测试 使用 Nodeunit 测试

使用 Nodeunit 测试

1年前 阅读 140 评论 0 赞 0

使用 Nodeunit 测试

问题

假如你正在使用 CoffeeScript 并且想要验证功能是否与预期一致,便可以决定使用 Nodeunit 测试框架。

讨论

Nodeunit 是一种 JavaScript 对于单元测试库( Unit Testing libraries )中 xUnit 族的实现,Java, Python, Ruby, Smalltalk 中均可以使用。

当使用 xUnit 族测试框架时,你需要将所需测试的描述预期功能的代码写在一个文件中。

例如,我们希望我们的计算器可以进行加法和减法,并且对于正负数均可以正确计算,我们的测试如下。

  1. # test/calculator.test.coffee
  2. Calculator = require '../calculator'
  3. exports.CalculatorTest =
  4. 'test can add two positive numbers': (test) ->
  5. calculator = new Calculator
  6. result = calculator.add 2, 3
  7. test.equal(result, 5)
  8. test.done()
  9. 'test can handle negative number addition': (test) ->
  10. calculator = new Calculator
  11. result = calculator.add -10, 5
  12. test.equal(result, -5)
  13. test.done()
  14. 'test can subtract two positive numbers': (test) ->
  15. calculator = new Calculator
  16. result = calculator.subtract 10, 6
  17. test.equal(result, 4)
  18. test.done()
  19. 'test can handle negative number subtraction': (test) ->
  20. calculator = new Calculator
  21. result = calculator.subtract 4, -6
  22. test.equal(result, 10)
  23. test.done()

安装 Nodeunit

在可以运行你的测试之前,你必须先安装 Nodeunit :

首先创建一个 package.json 文件

  1. {
  2. "name": "calculator",
  3. "version": "0.0.1",
  4. "scripts": {
  5. "test": "./node_modules/.bin/nodeunit test"
  6. },
  7. "dependencies": {
  8. "coffee-script": "~1.4.0",
  9. "nodeunit": "~0.7.4"
  10. }
  11. }

接下来从一个终端运行。

  1. $ npm install

运行测试

使用代码行可以简便地运行测试文件:

  1. $ npm test

测试失败,因为我们并没有 calculator.coffee

  1. suki@Yuzuki:nodeunit_testing (master)$ npm test
  2. npm WARN package.json calculator@0.0.1 No README.md file found!
  3. > calculator@0.0.1 test /Users/suki/tmp/nodeunit_testing
  4. > ./node_modules/.bin/nodeunit test
  5. /Users/suki/tmp/nodeunit_testing/node_modules/nodeunit/lib/nodeunit.js:72
  6. if (err) throw err;
  7. ^
  8. Error: ENOENT, stat '/Users/suki/tmp/nodeunit_testing/test'
  9. npm ERR! Test failed. See above for more details.
  10. npm ERR! not ok code 0

我们创建一个简单文件

  1. # calculator.coffee
  2. class Calculator
  3. module.exports = Calculator

并且重新运行测试套件。

  1. suki@Yuzuki:nodeunit_testing (master)$ npm test
  2. npm WARN package.json calculator@0.0.1 No README.md file found!
  3. > calculator@0.0.1 test /Users/suki/tmp/nodeunit_testing
  4. > ./node_modules/.bin/nodeunit test
  5. calculator.test
  6. CalculatorTest - test can add two positive numbers
  7. TypeError: Object #<Calculator> has no method 'add'
  8. ...
  9. CalculatorTest - test can handle negative number addition
  10. TypeError: Object #<Calculator> has no method 'add'
  11. ...
  12. CalculatorTest - test can subtract two positive numbers
  13. TypeError: Object #<Calculator> has no method 'subtract'
  14. ...
  15. CalculatorTest - test can handle negative number subtraction
  16. TypeError: Object #<Calculator> has no method 'subtract'
  17. ...
  18. FAILURES: 4/4 assertions failed (31ms)
  19. npm ERR! Test failed. See above for more details.
  20. npm ERR! not ok code 0

通过测试

让我们对方法进行实现来观察测试是否可以通过。

  1. # calculator.coffee
  2. class Calculator
  3. add: (a, b) ->
  4. a + b
  5. subtract: (a, b) ->
  6. a - b
  7. module.exports = Calculator

当我们重新运行测试时可以看到全部通过:

  1. suki@Yuzuki:nodeunit_testing (master)$ npm test
  2. npm WARN package.json calculator@0.0.1 No README.md file found!
  3. > calculator@0.0.1 test /Users/suki/tmp/nodeunit_testing
  4. > ./node_modules/.bin/nodeunit test
  5. calculator.test
  6. CalculatorTest - test can add two positive numbers
  7. CalculatorTest - test can handle negative number addition
  8. CalculatorTest - test can subtract two positive numbers
  9. CalculatorTest - test can handle negative number subtraction
  10. OK: 4 assertions (27ms)

重构测试

既然测试全部通过,我们应看一看我们的代码或测试是否可以被重构。

在我们的测试文件中,每个测试都创建了自己的 calculator 实例。这会使我们的测试相当的重复,特别是对于大型的测试套件。理想情况下,我们应该考虑将初始化代码移动到每次测试之前运行。

通常在其他的 xUnit 库中,Nodeunit 会提供一个 setUp(以及 tearDown )功能会在测试前调用。

  1. Calculator = require '../calculator'
  2. exports.CalculatorTest =
  3. setUp: (callback) ->
  4. @calculator = new Calculator
  5. callback()
  6. 'test can add two positive numbers': (test) ->
  7. result = @calculator.add 2, 3
  8. test.equal(result, 5)
  9. test.done()
  10. 'test can handle negative number addition': (test) ->
  11. result = @calculator.add -10, 5
  12. test.equal(result, -5)
  13. test.done()
  14. 'test can subtract two positive numbers': (test) ->
  15. result = @calculator.subtract 10, 6
  16. test.equal(result, 4)
  17. test.done()
  18. 'test can handle negative number subtraction': (test) ->
  19. result = @calculator.subtract 4, -6
  20. test.equal(result, 10)
  21. test.done()

我们可以重新运行测试,仍然可以全部通过。

你的支持将鼓励作者继续创作

评论(0)

(无)