RSpec is Rails' standard testing framework. More gems are needed compared to minitest. However, if you put all the gems at once, it becomes ambiguous which gem works where and what. Therefore, when learning RSpec, I decided to take a method of adding gems one by one according to the content of the test.
Introduce RSpec
and FactoryBot
for generating test data.
FactoryBot plays a fixture-like role in minitest.
If you put spring-commands-rspec
here, you can run RSpec from binstub
and use spring
to shorten the time it takes to start the test.
Gemfile.rb
group :development, :test do
gem "rspec-rails"
gem 'spring-commands-rspec'
gem "factory_bot_rails"
end
After bundle install
, generate the data for RSpec with the following command.
$ bundle exec rails generate rspec:install
Add RSpec settings.
Write the settings in config/application.rb
.
Here, it is set whether to generate a file for RSpec when the generate
command is executed.
Whether it is true
or false
is changed depending on the project.
config/application.rb
module SampleApp
class Application < Rails::Application
.
.
.
config.generators do |g|
g.test_framework :rspec,
controller_specs: true,
fixtures: true,
helper_specs: true,
model_specs: true,
request_spec: true,
routing_specs: false,
view_specs: false
end
end
end
Next, set up FactoryBot. Calling the FactoryBot class can be simplified by writing the following:
spec/rails_helper.rb
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end
#Call FactoryBot class
user = FactoryBot.create(:user)
#Abbreviated version
user = create(:user)
Another setting for test data.
Uncomment the following line.
Files under spec/support/
can be read.
Files that describe helpers for testing are placed here.
spec/rails_helper.rb
# The following line is provided for convenience purposes. It has the downside
# of increasing the boot-up time by auto-requiring all files in the support
# directory. Alternatively, in the individual `*_spec.rb` files, manually
# require only the support files necessary.
#
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
Finally, install RSpec's binstub.
Now you can run tests on $ bin/rspec spec/
in addition to $ bundle exec rspec spec/
.
$ bundle exec spring binstub rspec
#Execution command
$ bin/rspec spec/
All the files used by RSpec have the filename * _spec.rb
.
We will prepare various types according to the controller and model.
For example, the spec file for users_controller is generated as follows.
$ rails g rspec:controller users
create spec/controllers/users_controller_spec.rb
Use FactoryBot to define test data (instances) for various classes.
For example, in the case of User class, define it in /spec/factories/users.rb
.
/spec/factories/users.rb
FactoryBot.define do
#Define test data michael of User model
factory :michael, class: User do # Class:User may not be needed
name { 'michael' }
email { '[email protected]' }
end
#Prepare a lot of general-purpose data
factory :user do
sequence(:name) { |n| "name-#{n}"}
sequence(:email) { |n| "test-#{n}@example.com"}
end
end
Call the defined test data, store it in an instance variable, and use it in the test.
/spec/models/users_spec.rb
RSpec.describe User, type: :model do
before do
#Creating a model only
@michael = build(:michael)
#Record generation to DB
@michael = create(:michael)
#Utilization of general-purpose data
@user1 = build(:user)
@user2 = build(:user)
@user3 = build(:user)
end
.
.
.
end
Continue
Recommended Posts