+6

Cách setup môi trường Rspec3 không cần dùng Rails - 2023

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.rbspec/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)

image.png


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


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.