Hướng dẫn cơ bản với RSpec 3 - Khi bạn đọc các bài viết liên quan tới RSpec, có lẽ bạn đã hứng thú muốn học RSpec vì nó siêu tiện lợi. Nhưng khi bạn test, có thể gặp khó khăn đầu tiên về việc cài đặt môi trường cho RSpec khi không có Rails. Mình cảm giác rằng, những người thường xuyên code trong môi trường Rails thì hẳn đã từng gặp vấn đề này. Mình đã tìm hiểu thông qua nhiều trang web và muốn tổng hợp lại để giúp bản thân và mọi người.
Giả định
Chúng ta sẽ cài đặt RSpec dựa trên Bundler, vì vậy giả định ở đây là bạn đã có Bundler sẵn trong máy.
1. Tạo và chuyển vào thư mục làm việc tạm thời (rspec_test)
mkdir rspec_test
cd rspec_test
2. Khởi tạo bundler và cài đặt rspec
Khởi tạo với lệnh init
bundle init
Gemfile sẽ được tạo, bạn chỉnh sửa như sau:
Gemfile
# A sample Gemfile
source "https://rubygems.org" #gem "rails"
gem "rspec", ">= 3.0.0"
Cài đặt rspec3 với bundle
bundle install
3. Khởi tạo RSpec
Thực hiện lệnh sau sẽ tạo ra hai file: .rspec và spec/spec_helper.rb.
bundle exec rspec --init
Trong spec/spec_helper.rb, hầu như tất cả các dòng đều được comment. Bạn cần bỏ comment để kích hoạt. Xóa phần =begin và =end để mở comment.
spec/spec_helper.rb
...
RSpec.configure do |config| config.filter_run :focus config.run_all_when_everything_filtered = true ... mocks.verify_partial_doubles = true end end
Việc khởi tạo gần như đã hoàn tất. Bây giờ bạn chỉ cần chuẩn bị file test và thực thi nó.
4. Chuẩn bị code và code test (Spec)
Ở đây, chúng ta giả định rằng code sẽ được đặt trong thư mục lib, còn code test (Spec) sẽ nằm trong thư mục spec. Với giả định đó, chúng ta tạo lib/hello.rb
và spec/hello_spec.rb
.
rspec_test
├── Gemfile
├── Gemfile.lock
├── lib
│ └── hello.rb
└── spec ├── hello_spec.rb └── spec_helper.rb
lib/hello.rb
class Hello def message "hello" end
end
spec/hello_spec.rb
require_relative '../lib/hello' RSpec.describe Hello do it "message return hello" do expect(Hello.new.message).to eq "hello" end
end
Trong hello_spec.rb, cách chúng ta sử dụng require có khác một chút so với Rails (vì trong Rails tất cả đã được tự động require). Ở đây, chúng ta sử dụng phương thức require_relative để require file hello.rb dựa vào đường dẫn tương đối.
Phương thức require_relative đã có từ ruby phiên bản 1.9, nhưng nếu bạn không muốn sử dụng require_relative thì có thể làm như sau:
require File.expand_path('../lib/hello', File.dirname(__FILE__)) RSpec.describe Hello do it "message return hello" do expect(Hello.new.message).to eq "hello" end
end
【Chú ý】 Dù việc require ở mỗi file spec cũng ok, nhưng một cách tốt hơn là chúng ta nên tổ chức việc require ở một chỗ. Bạn có thể thêm cấu hình sau vào spec_helper.rb, và ở mỗi file test, chỉ cần require 'spec_helper'.
spec/spec_helper.rb
#... lược bỏ
Dir[File.join(File.dirname(__FILE__), "../lib/**/*.rb")].each { |f| require f }
spec/hello_spec.rb
require 'spec_helper' RSpec.describe Hello do it "message return hello" do expect(Hello.new.message).to eq "hello" end
end
5. Chạy test
Chạy test với lệnh rspec:
bundle exec rspec
Nếu test chạy xanh (pass) thì mọi thứ đã OK!
Bổ sung: Chạy test với lệnh rake.
Với Rails, chúng ta thường sử dụng lệnh rake spec để thực thi RSpec. Nếu bạn muốn thực thi test bằng rake, bạn có thể:
- Thêm gem 'rake' vào Gemfile
# A sample Gemfile
source "https://rubygems.org" gem "rspec", ">= 3.0.0"
gem "rake"
- Tạo Rakefile
require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) task :default => :spec
- Thực thi lệnh rake:
bundle exec rake
Dù bạn đã biết về RSpec qua Rails hay chưa, mình hy vọng bài viết này giúp bạn hiểu rõ hơn cách cài đặt và sử dụng RSpec ở môi trường không phải Rails. Đặc biệt khi bạn muốn viết các thư viện ruby hoặc các ứng dụng ruby độc lập. Chúc các bạn thành công. 😉
Mình hy vọng bạn thích bài viết này và học thêm được điều gì đó mới.
Donate mình một ly cafe hoặc 1 cây bút bi để mình có thêm động lực cho ra nhiều bài viết hay và chất lượng hơn trong tương lai nhé. À mà nếu bạn có bất kỳ câu hỏi nào thì đừng ngại comment hoặc liên hệ mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm ơn.
Momo: NGUYỄN ANH TUẤN - 0374226770
TPBank: NGUYỄN ANH TUẤN - 0374226770 (hoặc 01681423001)
English Version
So you're keen on learning RSpec because you've heard it's super handy. I get it; it’s a cool tool for testing. But sometimes, you might stumble when setting it up without Rails. Don't worry; I've gathered the steps for you. Let's rock it!
Assumptions
We'll be using Bundler to set up RSpec. Assuming you've already got Bundler on your computer, we're good to go.
1. Make & Go to Your Work Folder (rspec_test
)
Let's start by creating a temporary folder and hopping into it:
mkdir rspec_test
cd rspec_test
2. Boot Up Bundler & Get RSpec
First, initialize Bundler:
bundle init
This action will produce a Gemfile. Edit it to look like this:
# A basic Gemfile
source "https://rubygems.org" #gem "rails"
gem "rspec", ">= 3.0.0"
Now, let’s install RSpec using bundle:
bundle install
3. Initialize RSpec
Run the command below; it'll generate two files for ya: .rspec
and spec/spec_helper.rb
.
bundle exec rspec --init
In spec/spec_helper.rb
, most lines are comments. Let's activate them by removing the =begin
and =end
tags.
4. Time for Some Code & Its Test (Spec)
We're assuming you'll place your code in a lib
folder, and the tests (Spec) in a spec
folder. So, create lib/hello.rb
and spec/hello_spec.rb
:
rspec_test
├── Gemfile
├── Gemfile.lock
├── lib
│ └── hello.rb
└── spec ├── hello_spec.rb └── spec_helper.rb
For the actual code:
# lib/hello.rb
class Hello def message "hello" end
end
And its test:
# spec/hello_spec.rb
require_relative '../lib/hello' RSpec.describe Hello do it "says hello" do expect(Hello.new.message).to eq "hello" end
end
Note: We're using require_relative
to load our code file based on its path. It's been around since Ruby 1.9. If you don't fancy it, you can go the other way:
require File.expand_path('../lib/hello', File.dirname(__FILE__))
Pro Tip! 🌟 Instead of requiring files in each spec, it's better to handle it in one spot. Add this configuration to spec_helper.rb
. From then on, only require 'spec_helper' in your tests.
5. Run the Test
Execute the test with:
bundle exec rspec
If the test passes (goes green), you're golden!
Bonus: Running Test with rake
In Rails, you might use rake spec
to run RSpec. Want to do it here? Easy peasy:
- Add the 'rake' gem to the Gemfile.
- Create a Rakefile with the provided content.
- Run the test using:
bundle exec rake
Whether you've used RSpec with Rails or not, I hope this walkthrough clarifies setting it up outside of Rails. Perfect for crafting Ruby libraries or standalone apps. Best of luck, and happy coding! 😉👨💻🚀
簡単な日本語版
RSpecの記事を読むと、とっても便利そうだと思って学びたくなりますよね。でも、Railsがない環境でRSpecの設定がちょっと難しいかもしれません。私もそう感じました。そこで、いろいろなサイトを調べて、このガイドを作りました。みんなの役に立てたらいいな。
前提
このガイドでは、Bundlerを使ってRSpecをセットアップします。Bundlerはもうインストールしてると思って進めますね。
1. 作業用のフォルダを作成・移動(rspec_test)
mkdir rspec_test
cd rspec_test
2. Bundlerを初期化してRSpecをインストール
initコマンドで初期化
bundle init
次にGemfileをこんな風に編集:
Gemfile
# 例のGemfile
source "https://rubygems.org" #gem "rails"
gem "rspec", ">= 3.0.0"
RSpec3をインストール
bundle install
3. RSpecを初期化
次のコマンドで、.rspecとspec/spec_helper.rbファイルができます。
bundle exec rspec --init
spec/spec_helper.rbの中にはコメントがたくさん。コメントを外してください。
spec/spec_helper.rb
...
RSpec.configure do |config| config.filter_run :focus config.run_all_when_everything_filtered = true ... mocks.verify_partial_doubles = true end end
これで、準備はほぼ完了!テストファイルを作って、実行するだけです。
4. コードとテストコード(Spec)の準備
ここでは、コードはlibフォルダに、テストコードはspecフォルダに入れるとします。
rspec_test
├── Gemfile
├── Gemfile.lock
├── lib
│ └── hello.rb
└── spec ├── hello_spec.rb └── spec_helper.rb
lib/hello.rb
class Hello def message "hello" end
end
spec/hello_spec.rb
require_relative '../lib/hello' RSpec.describe Hello do it "messageがhelloを返す" do expect(Hello.new.message).to eq "hello" end
end
Railsとは違い、必要なファイルを自分でrequireする必要があります。
注意 requireを各テストファイルで書くのもいいけど、一箇所でまとめた方がいいです。
spec/spec_helper.rb
#... 一部省略
Dir[File.join(File.dirname(__FILE__), "../lib/**/*.rb")].each { |f| require f }
spec/hello_spec.rb
require 'spec_helper' RSpec.describe Hello do it "messageがhelloを返す" do expect(Hello.new.message).to eq "hello" end
end
5. テストを実行
rspecコマンドでテスト実行:
bundle exec rspec
テストが通れば、すべてうまく行っています!
おまけ: rakeコマンドでテストを実行
Railsでは、rake specでRSpecを実行します。同じことをしたいなら:
- Gemfileに
gem 'rake'
を追加
# 例のGemfile
source "https://rubygems.org" gem "rspec", ">= 3.0.0"
gem "rake"
- Rakefileを作成
require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) task :default => :spec
- rakeコマンドで実行:
bundle exec rake
RailsでRSpecを使ったことがあるかどうか、このガイドが皆さんに役立つことを願っています。特にRubyのライブラリやスタンドアロンのアプリを作るときに。頑張ってくださいね!😉
Original article: https://qiita.com/takaesu_ug/items/db44b81bdddf6ed0e9f5