使用 Rspec 测试 Rails 3.1 可安装引擎

Posted

技术标签:

【中文标题】使用 Rspec 测试 Rails 3.1 可安装引擎【英文标题】:Testing Rails 3.1 mountable engine with Rspec 【发布时间】:2011-11-19 02:29:57 【问题描述】:

我开始制作 Rails 3.1 引擎,但我很难使用 rspec 对其进行测试。

首先,如果我运行rails g integration_test whatever,它会在测试/集成而不是规范/请求中创建一个常规集成测试(rspec-rails gem 已安装,并且需要作为 gemspec 文件中的开发依赖项)

另外,当我运行规范测试时,我收到一条错误消息,指出与我正在测试的模型对应的表尚未创建。我尝试了rake engine_name:install:migrations 并从虚拟应用程序内部运行rake db:migrate,我收到“表已存在”错误。

一切似乎都断开了,我觉得我在这里遗漏了一些东西,以使 rspec gem 无缝工作,就像它通常与完整的 rails 应用程序一样。

我从这里http://rubyx.com/2011/03/01/start-your-engines 开始跟踪所有更改,我可以通过控制台启动虚拟应用程序来手动测试引擎,如下所示http://railscasts.com/episodes/277-mountable-engines。

有没有办法让 rspec 成为测试 rails 3.1 引擎的默认值?

【问题讨论】:

在 Rails 3.2 中已经解决了一些问题,但我总是忘记如何迁移测试数据库。要在测试数据库上运行迁移,请在 gem 的目录中运行 rake app:db:test:prepare 我刚刚实现了本文的方法,没有任何问题。 viget.com/extend/… 【参考方案1】:

我正在使用带有 Rails 引擎的 RSpec,没有问题。

我使用以下开关创建了我的插件:-T --full --dummy-path=spec/dummy。

-T 不包括测试/单元 --full 表示插件是引擎 --dummy-path 只是让我们没有得到一个测试目录( 默认是测试/虚拟)。

从那里我使用了“启动引擎”文章中的 spec_helper:

# Configure Rails Envinronment
ENV["RAILS_ENV"] = "test"
require File.expand_path("../dummy/config/environment.rb",  __FILE__)

require 'rspec/rails'

ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[File.join(ENGINE_RAILS_ROOT, "spec/support/**/*.rb")].each |f| require f 

RSpec.configure do |config|
  config.use_transactional_fixtures = true
end

对于发电机。我将 config.generators 块添加到我的 engine.rb 文件中,如下所示:

module MyEngine
  class Engine < Rails::Engine
    config.generators do |g|
      g.test_framework :rspec, :view_specs => false
    end
  end
end

这样,我可以在运行像模型生成器这样的生成器时进行 rspec 测试。

至于数据库,您的 database.yml 文件是否设置正确?您是否加载了测试环境,例如rake db:test:clone 还是 rake db:migrate RAILS_ENV=test?我的猜测是 RSpec 看不到您的表,因为没有设置测试数据库。

【讨论】:

我不应该使用--mountable而不是--full吗? 我按照您的答案进行了更改,但我仍然无法使用生成器。如果我尝试rails g integration_test posts 什么都不会发生。也许你遗漏了什么? 我不使用 integration_test 生成器,所以我不确定。只是传递 --full 意味着它是一个标准引擎非命名空间并将生成虚拟项目。我很确定您还需要为 --mountable 传递 --full 才能生成虚拟项目,但也许自 RC 以来这种情况发生了变化?如果您使用 rails g 模型...或控制器会发生什么? @dwite 您可能想要编辑您的答案以包括生成的规范需要用“模块 MyEngine ... end”阻止这一事实,否则您会得到一个“未初始化的常量”错误。 你可以用MyEngine.root代替ENGINE_RAILS_ROOT【参考方案2】:

我一直在寻找相同的答案,我找到了the combustion gem*,它承诺设置一个完整的环境,以更简单的方式规范您的引擎。只需添加

gem.add_development_dependency 'combustion', '~> 0.3.1'

到你的 gemspec 并运行

bundle exec combust

在您的规范目录中重现完整的 Rails 应用程序。

*我还没试过……

【讨论】:

感谢您的参考——燃烧岩石。

以上是关于使用 Rspec 测试 Rails 3.1 可安装引擎的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 3.1 中使用 Capybara、Rspec 和 Selenium 进行测试时登录失败

Rails 3.1 插件 gem、虚拟测试应用程序、rspec

如何使用rails cucumber,rspec,capybara在视图(dhtml)中测试动态部分?

ruby [rspec]“使用RSpec测试Rails程序”笔记

设置 RSpec 以测试 gem(不是 Rails)

使用 rspec 测试文件上传 - rails