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

jro*_*ind 40 gem rspec ruby-on-rails ruby-on-rails-plugins rspec-rails

所以Rails 3.1附带了一个鲜为人知的"rails g plugin new"生成器,它为你提供了一个适合rails gem插件的骨架.[http://guides.rubyonrails.org/plugins.html#or-generate-a-gemified-plugin]

这样做的一个有用的事情是为Test :: Unit的测试设置方便.它为您提供了一个基本的虚拟Rails应用程序,您的测试可以在上下文中运行,以测试仅在Rails应用程序副本中运行的"引擎"行为.(它把它放在./test/dummy中).但是你的测试仍然在my_gem/test中,测试不会存在于虚拟app中.并且my_gem/test/test_helper.rb在那里编写,测试将在虚拟应用程序的上下文中运行,在../dummy/config/environment上启动.

我之所以这样描述是因为我认为很多人都不知道这个新的发电机,它可以很好地设置.

但我的问题是,有没有人想出如何用rspec做这个呢?我曾尝试按照相同的原则DIY为rails specing中的rspec设置这样的东西,但我遇到了各种令人困惑的障碍,我希望也许别人已经弄明白了(或者有兴趣搞定它对我们其他人来说,嘿).

小智 94

创建没有测试单元的插件,并指定虚拟应用程序的路径:

rails plugin new foobar --skip-test-unit --dummy-path=spec/dummy
Run Code Online (Sandbox Code Playgroud)

将rspec-rails添加为gemspec文件(foobar.gemspec)的开发依赖项:

Gem::Specification.new do |s|
  .
  .
  .
  s.add_development_dependency "rspec-rails"
end
Run Code Online (Sandbox Code Playgroud)

bundle install

创建从虚拟应用程序到插件规范目录的符号链接并运行Rspec安装生成器:

cd spec/dummy
ln -s ../../spec
rails generate rspec:install
cd -
Run Code Online (Sandbox Code Playgroud)

现在编辑spec/spec_helper.rb(或spec/rails_helper.rb在rails 4+中,不确定旧版本)更改此行(第3行):

require File.expand_path("../../config/environment", __FILE__)
Run Code Online (Sandbox Code Playgroud)

对此:

require File.expand_path("../dummy/config/environment", __FILE__)
Run Code Online (Sandbox Code Playgroud)

现在您可以从插件的根目录运行Rspec,它也将从虚拟应用程序中获取规范.

bundle exec rspec spec
Run Code Online (Sandbox Code Playgroud)

我更详细地写了这篇文章,展示了如何在带有虚拟应用程序的rails插件中设置capybara,spork和guard:

https://web.archive.org/web/20130125091106/http://namick.tumblr.com/post/17663752365/how-to-create-a-gemified-plugin-with-rails-3-2-rspec

  • 对我来说,行:`require File.expand_path("../../ config/environment",__ FILE __)`位于`spec/rails_helper.rb`而不是`spec/spec_helper.rb`.这是由于Rspec的变化吗? (5认同)

小智 21

只需运行rails plugin new <gemname>然后将rspec作为development_dependency添加到gemspec文件,然后安装它rspec --init.

现在将虚拟子文件夹从中移动testspec并添加到spec_helper:

ENV["RAILS_ENV"] = "test"

require File.expand_path("../dummy/config/environment.rb",  __FILE__)
require "rails/test_help"
require '<gemname>'

Rails.backtrace_cleaner.remove_silencers!
Run Code Online (Sandbox Code Playgroud)

因为他们在test_helper!

  • 这对我来说非常有效,比其他答案简单得多 (3认同)