37

我开始制作 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 引擎的默认值?

4

2 回答 2

62

我将 RSpec 与 Rails 引擎一起使用,没有问题。

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

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

从那里我使用了“启动引擎”文章中的 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:clonerake db:migrate RAILS_ENV=test?我的猜测是 RSpec 看不到您的表,因为没有设置测试数据库。

于 2011-09-19T14:09:39.447 回答
9

我一直在寻找相同的答案,我发现了燃烧宝石*,它承诺设置一个完整的环境,以更简单的方式来规范你的引擎。只需添加

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

到您的 gemspec 并运行

bundle exec combust

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

*我还没试过...

于 2012-03-14T00:09:19.313 回答