Rails 3.1中的JavaScript单元测试

Rails 3.1中的JavaScript单元测试,javascript,ruby-on-rails,ruby,unit-testing,ruby-on-rails-3.1,Javascript,Ruby On Rails,Ruby,Unit Testing,Ruby On Rails 3.1,我想知道作为Rails 3.1应用程序的一部分进行JavaScript单元测试的最简单方法是什么 我非常喜欢Jasmine,而且它工作得非常好(尽管它需要一些技巧来获取.coffee文件) Jasmine的唯一问题是,它在一个巨大的页面中运行所有的测试示例,这是非常有问题的,因为它需要加载所有的脚本 我真正想要的是Jasmine+多个文件中的多个测试套件(以便它生成多个html文件,包括spec文件) 除此之外,我希望在浏览器中运行测试(希望很容易),无头或在JS引擎中(如果可能的话) 有什么建

我想知道作为Rails 3.1应用程序的一部分进行JavaScript单元测试的最简单方法是什么

我非常喜欢Jasmine,而且它工作得非常好(尽管它需要一些技巧来获取
.coffee
文件)

Jasmine的唯一问题是,它在一个巨大的页面中运行所有的测试示例,这是非常有问题的,因为它需要加载所有的脚本

我真正想要的是Jasmine+多个文件中的多个测试套件(以便它生成多个html文件,包括spec文件)

除此之外,我希望在浏览器中运行测试(希望很容易),无头或在JS引擎中(如果可能的话)


有什么建议吗?

或许可以试试茉莉无头webkit(https://github.com/johnbintz/jasmine-headless-webkit). 这提供了在无头WebKit浏览器中运行Jasmine规范的功能。

您可能需要尝试
常青
(https://github.com/jnicklas/evergreen). 它允许您使用
jasmine
编写测试用例,并在无头浏览器或JS引擎中运行测试

您可以在自述部分找到此gem的用法

不幸的是,evergreen还不能很好地使用Rails3.1的新特性(在给出这个答案时)。因此,我尝试创建一些猴子补丁,让它发挥良好

# config/evergreen.rb
unless defined?(CONFIG_EVERGREEN_LOADED)
  CONFIG_EVERGREEN_LOADED = true

  require ::File.expand_path('../environment',  __FILE__)

  unless "".respond_to?(:each) # this monkey patch make the old capybara play well with ruby 1.9.2
    String.class_eval do
      def each &block
        self.lines &block
      end
    end
  end

  module Evergreen

    class << self
      def application_with_additions(suite)
        app = application_without_additions(suite)

        app.map "/assets" do
          assets = Rails.application.config.assets
          if assets.enabled
            require 'sprockets'
            sprockets = Sprockets::Environment.new(suite.root)
            sprockets.static_root = File.join(suite.root, 'public', assets.prefix)
            sprockets.paths.concat assets.paths
            sprockets.js_compressor = nil
            run sprockets
          end
        end
        app
      end

      alias_method :application_without_additions, :application
      alias_method :application, :application_with_additions
    end

end
#config/everyvan.rb
除非定义?(配置\加载)
CONFIG_EVERGREEN_LOADED=true
require::File.expand_path(“../environment”,_文件)
除非“.respond_to”(:each)#此猴子补丁使旧水豚能够很好地与ruby 1.9.2配合使用
String.class\u eval do
定义每个块(&B)
自动线和块
结束
结束
结束
模块常绿

到目前为止,我还没有找到一个合理的答案。但是,如果它能够实现的话,它很可能是接近答案的了

大部分内容都是我写的,这是基于我编写javascript规范和使用Rails3.1/coffeescript的经验。你的问题包括一些让我首先想贡献的东西

编辑:


为了澄清,Teaspoon支持定义多个套件,有一个rake任务,支持使用Selenium Webdriver或PhantomJS作为驱动程序,Jasmine、Mocha或QUnit测试框架,允许从命令行运行(例如bundle exec Teaspoon spec/javascripts/my_spec.coffee
),以及其他一些很好的工具,我们想找到一个解决方案来涵盖你提到的大部分内容

我们研究了以下框架:

我们最后挑了一茶匙。 它需要最少的设置,并且很容易与我们的CI集成。
它提供了套件、资产管道支持(这样您就可以测试.coffee而不需要hacks),并且可以在RAILS_ENV=test中运行它仍然使用一个页面进行所有测试。正是我不需要的。天哪。伙计们,开始读这个问题。我认为evergreen不支持多个文件/suites我认为@evergreen支持多个文件?您还可以为每个测试要求文件,而不是同时要求所有资源。虽然我不是常青树的粉丝,但这是一个选择。。。因为您可以指定要运行的测试子集,而不需要加载每个文件。Evergreen在这一点上是弃用软件,所以我建议避免使用它。为了升级我们的水豚宝石,我们不得不扔掉它,所以虽然它是一块很好的宝石,但这并不是一个好主意。@StingeyB从2013年底开始,你推荐的替代方案是什么?@Trip我们用茶匙。迁移最终变得非常简单。我们必须为每个规范定义单独的套件,但在那之后,在phantom和selenium中运行它就轻而易举了。我的长期解决方案是将javascript编写成模块,这样测试就可以只加载所需的内容,但是茶匙是evergreen的一个很好的替代品。谢谢Jeremy。看起来真不错。我还没有尝试它是如何工作的,因为我目前正在使用Jasminerice。Jasminerice是我在写Teabag之前使用的。我喜欢它,但希望通过命令行和CI运行更多。