1

我想使用 CoffeeScript 来构建本质上是 JavaScript 库的东西。

我只想能够

  1. 定义一些类,继承
  2. 将我的代码保存在几个文件中
  3. 编写一些单元测试(QUnit 或其他任何工作,最好用 CoffeeScript 编写测试)
  4. (理想情况下)在我工作时自动监视和构建项目

这似乎很合理,不是吗?我的计划只是让单元测试在浏览器中针对已编译的 JavaScript 运行,但如果我可以直接在 node.js 中运行它们,那就更好了。

目前我正在尝试使用CoffeeToasterQUnit来做到这一点,使用两种不同的 CoffeeToaster 配置,一种带有测试,一种没有。它正在工作,但也许有人有更好的建议?我应该放弃 CoffeeToaster 并使用Cake吗?或者获得另一个单元测试框架?任何人都可以指出我的教程吗?我正在制作一个客户端 JS lib,所以我不想涉及 Rails 等。

4

1 回答 1

4

我目前正在使用:

我的代码存在,src/我用 CoffeeScript 编写测试。我make用来构建和测试代码。

  • make build将 CoffeeScript 编译src/lib/.
  • make test构建代码,然后在test/.
  • make monitor一旦测试发生变化,就会监视并运行测试。不幸的是,它不会重新编译代码。我使用 Vim 键绑定来调用make,这也会触发 Mocha 重新运行测试。 编辑:如果这让您感到困扰,您可以运行.coffee --watch -o lib/ -c src/
  • make coverage生成代码覆盖率报告并将其放入lib-cov/report.html.

我的Makefile看起来有点像这样:

COFFEE = ./node_modules/.bin/coffee --compile
MOCHA = NODE_ENV=test ./node_modules/.bin/mocha
MOCHA_OPTS = \
    --compilers coffee:coffee-script \
    --require should \
    --colors
REPORTER = spec

build:
    @$(COFFEE) --output lib/ src/

test: build
    @$(MOCHA) --reporter $(REPORTER) $(MOCHA_OPTS)

monitor:
    @$(MOCHA) --reporter min $(MOCHA_OPTS) \
    --watch --growl

coverage: instrument
    @MYLIB_COV=1 $(MOCHA) $(MOCHA_OPTS) \
    --reporter html-cov > lib-cov/report.html

instrument: build
    @rm -rf ./lib-cov
    @jscoverage ./lib ./lib-cov

.PHONY: build test monitor coverage instrument

您可能只需很少修改即可使用上述内容。

要使用 生成覆盖率报告make coverage,必须针对已检测的代码lib-cov/而不是 中的代码运行测试lib/。要做到这一点,需要做三件事:

  1. Makefile应该设置一个环境变量,例如(根据MYLIB_COV 需要更改名称)。

  2. index.js应该查看此环境变量,或者require相应地查看:lib/lib-cov/

    // index.js
    module.exports = process.env.MYLIB_COV
      ? require('./lib-cov/mylib')
      : require('./lib/mylib');
    

    如果您需要从多个源文件导出,您可以在此处合并它们。如果您index.js的 package.json 中有除“main”以外的其他内容,请不要忘记更改它。

  3. 您的测试应该require '../'

    # test/test.user.coffee
    describe 'User', ->
      User = {}
    
      before ->
        {User} = require '../'
    
      describe '#equals()', ->
        describe 'when users have the same username and host', ->
          it 'should return true', ->
            user1 = new User 'user', 'some.host.foo'
            user2 = new User 'user', 'some.host.foo'
            user1.equals(user2).should.be.true
    
      # etc.
    

我将把它作为练习留给读者,以了解他们是否需要 Mockery 以及如果需要如何使用它。不过,我要指出,require上面测试片段中的调用是在内部完成before的,这是有原因的。

快乐编码!

于 2012-10-01T09:31:35.377 回答