在编写 gem 时如何测试虚拟 rails 应用程序?
How do you test a dummy rails app when writing a gem?
我正在编写一个与 rails 集成的 gem,我希望能够在我的 gem 中测试一个带有 rspec 的虚拟应用程序测试套件。
当我测试我的虚拟 rails 应用程序是否加载/几个模块时出现问题
rspec spec/integration/rails/load_path_spec.rb
到目前为止,这是我拥有的:
# spec/support/rails_app/config/environment.rb
# Load the Rails application.
require File.expand_path('../application', __FILE__)
# Load the gem
require 'skinny_controllers'
# Initialize the Rails application.
Rails.application.initialize!
我的测试是这样的:
require 'rails_helper'
describe 'definitions of operations and policies' do
it 'loads operations' do
is_defined = defined? EventOperations
expect(is_defined).to be_truthy
end
it 'loads policies' do
is_defined = defined? EventPolicy
expect(is_defined).to be_truthy
end
end
rails_helper 看起来像这样:
require 'rails/all'
require 'factory_girl'
require 'factory_girl_rails'
require 'rspec/rails'
require 'support/rails_app/config/environment'
ActiveRecord::Migration.maintain_test_schema!
# set up db
# be sure to update the schema if required by doing
# - cd spec/rails_app
# - rake db:migrate
ActiveRecord::Schema.verbose = false
load "support/rails_app/db/schema.rb" # use db agnostic schema by default
require 'support/rails_app/factory_girl'
# require 'support/rails_app/factories'
require 'spec_helper'
而 spec_helper 看起来像这样:
require 'rubygems'
require 'bundler/setup'
require 'pry-byebug' # binding.pry to debug!
require 'awesome_print'
# Coverage
ENV['CODECLIMATE_REPO_TOKEN'] = ''
require 'codeclimate-test-reporter'
CodeClimate::TestReporter.start if ENV['TRAVIS']
# This Gem
require 'skinny_controllers'
$LOAD_PATH.unshift Dir[File.dirname(__FILE__) + '/support/operations'].first
$LOAD_PATH.unshift Dir[File.dirname(__FILE__) + '/support/policies'].first
Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each do |file|
# skip the dummy app
next if file.include?('support/rails_app')
require file
end
# This file was generated by the `rspec --init` command. Conventionally, all
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
# Require this file using `require "spec_helper"` to ensure that it is only
# loaded once.
#
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
config.run_all_when_everything_filtered = true
config.filter_run :focus
# Run specs in random order to surface order dependencies. If you find an
# order dependency and want to debug it, you can fix the order by providing
# the seed, which is printed after each run.
# --seed 1234
config.order = 'random'
end
似乎有一半的时间,当我 运行 rspec
时,所有测试都通过了。
如果有人好奇,我的存储库在这里:https://github.com/NullVoxPopuli/skinny_controllers
这是我最终测试 rails 应用程序的方式
here is the gem where I have a dummy rails app
无论您想要测试您的 rails 应用程序的规范文件,您都需要一个新文件,我将其命名为 rails_helper.rb
require 'rails/all'
require 'factory_girl'
require 'factory_girl_rails'
require 'rspec/rails'
require 'support/rails_app/config/environment'
ActiveRecord::Migration.maintain_test_schema!
# set up db
# be sure to update the schema if required by doing
# - cd spec/support/rails_app
# - rake db:migrate
ActiveRecord::Schema.verbose = false
load 'support/rails_app/db/schema.rb' # db agnostic
require 'support/rails_app/factory_girl'
require 'spec_helper'
然后在 spec/support
文件夹中,在那里生成您的 rails 应用程序。我的位于:'spec/support/rails_app'。在这里,与默认脚手架生成的内容相比,rails 应用程序可以非常精简。
我确实必须在 config/environment.rb
中对应用程序进行更改
# Load the Rails application.
require File.expand_path('../application', __FILE__)
# gem should be required here
require 'skinny_controllers'
# Initialize the Rails application.
Rails.application.initialize!
而对于 database.yml、
default: &default
adapter: sqlite3
pool: 5
timeout: 5000
development:
<<: *default
database: db/development.sqlite3
test:
<<: *default
database: db/test.sqlite3
如果需要,可以将数据库设置更改为使用内存中的 sqlite。
希望就是这样。如果我遗漏了什么,我会更新这个答案。
我正在编写一个与 rails 集成的 gem,我希望能够在我的 gem 中测试一个带有 rspec 的虚拟应用程序测试套件。
当我测试我的虚拟 rails 应用程序是否加载/几个模块时出现问题
rspec spec/integration/rails/load_path_spec.rb
到目前为止,这是我拥有的:
# spec/support/rails_app/config/environment.rb
# Load the Rails application.
require File.expand_path('../application', __FILE__)
# Load the gem
require 'skinny_controllers'
# Initialize the Rails application.
Rails.application.initialize!
我的测试是这样的:
require 'rails_helper'
describe 'definitions of operations and policies' do
it 'loads operations' do
is_defined = defined? EventOperations
expect(is_defined).to be_truthy
end
it 'loads policies' do
is_defined = defined? EventPolicy
expect(is_defined).to be_truthy
end
end
rails_helper 看起来像这样:
require 'rails/all'
require 'factory_girl'
require 'factory_girl_rails'
require 'rspec/rails'
require 'support/rails_app/config/environment'
ActiveRecord::Migration.maintain_test_schema!
# set up db
# be sure to update the schema if required by doing
# - cd spec/rails_app
# - rake db:migrate
ActiveRecord::Schema.verbose = false
load "support/rails_app/db/schema.rb" # use db agnostic schema by default
require 'support/rails_app/factory_girl'
# require 'support/rails_app/factories'
require 'spec_helper'
而 spec_helper 看起来像这样:
require 'rubygems'
require 'bundler/setup'
require 'pry-byebug' # binding.pry to debug!
require 'awesome_print'
# Coverage
ENV['CODECLIMATE_REPO_TOKEN'] = ''
require 'codeclimate-test-reporter'
CodeClimate::TestReporter.start if ENV['TRAVIS']
# This Gem
require 'skinny_controllers'
$LOAD_PATH.unshift Dir[File.dirname(__FILE__) + '/support/operations'].first
$LOAD_PATH.unshift Dir[File.dirname(__FILE__) + '/support/policies'].first
Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each do |file|
# skip the dummy app
next if file.include?('support/rails_app')
require file
end
# This file was generated by the `rspec --init` command. Conventionally, all
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
# Require this file using `require "spec_helper"` to ensure that it is only
# loaded once.
#
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
config.run_all_when_everything_filtered = true
config.filter_run :focus
# Run specs in random order to surface order dependencies. If you find an
# order dependency and want to debug it, you can fix the order by providing
# the seed, which is printed after each run.
# --seed 1234
config.order = 'random'
end
似乎有一半的时间,当我 运行 rspec
时,所有测试都通过了。
如果有人好奇,我的存储库在这里:https://github.com/NullVoxPopuli/skinny_controllers
这是我最终测试 rails 应用程序的方式 here is the gem where I have a dummy rails app
无论您想要测试您的 rails 应用程序的规范文件,您都需要一个新文件,我将其命名为 rails_helper.rb
require 'rails/all'
require 'factory_girl'
require 'factory_girl_rails'
require 'rspec/rails'
require 'support/rails_app/config/environment'
ActiveRecord::Migration.maintain_test_schema!
# set up db
# be sure to update the schema if required by doing
# - cd spec/support/rails_app
# - rake db:migrate
ActiveRecord::Schema.verbose = false
load 'support/rails_app/db/schema.rb' # db agnostic
require 'support/rails_app/factory_girl'
require 'spec_helper'
然后在 spec/support
文件夹中,在那里生成您的 rails 应用程序。我的位于:'spec/support/rails_app'。在这里,与默认脚手架生成的内容相比,rails 应用程序可以非常精简。
我确实必须在 config/environment.rb
# Load the Rails application.
require File.expand_path('../application', __FILE__)
# gem should be required here
require 'skinny_controllers'
# Initialize the Rails application.
Rails.application.initialize!
而对于 database.yml、
default: &default
adapter: sqlite3
pool: 5
timeout: 5000
development:
<<: *default
database: db/development.sqlite3
test:
<<: *default
database: db/test.sqlite3
如果需要,可以将数据库设置更改为使用内存中的 sqlite。
希望就是这样。如果我遗漏了什么,我会更新这个答案。