2017/10/19
Ruby - RSpec 的使用方法
markdown
## RSpec 簡介
RSpec 在執行的時候不保證執行順序,每個測試產生的資料不會自動被清除。
新增測試的generator語法:
```
rails generate rspec:model user
```
這樣寫會建立一個檔案在 spec/models/user_spec.rb
執行測試的指令是在 rails 專案目錄下輸入以下指令:
```
# 這裡是 bash
# 執行所有測試
rspec
# 執行某個資料夾下的所有測試
rspec ./spec/models
# 執行某個檔案裡的所有測試
rspec ./spec/models/user_spec.rb
# 執行某個檔案裡的某個測試
rspec ./spec/models/user_spec.rb:8
```
簡單的範例
```
require 'rails_helper'
RSpec.describe "規格說明" do
describe "處於某個狀態下" do
# 設定狀態變數
let(:a) { 1 }
it "should be 1" do
puts "should be 1"
expect(a).to eq(1)
end
end
end
```
let 在每次測試裡,第一次存取變數時就會執行對應的程式
```
require 'rails_helper'
RSpec.describe "規格說明" do
describe "處於某個狀態下" do
let(:a) { puts "let a"; 1 }
it "1" do
puts "1"
puts "a=#{a}"
end
it "2" do
puts "2"
puts "a=#{a}"
puts "a=#{a}"
puts "a=#{a}"
end
end
end
```
輸出
```
1
let a
a=1
.2
let a
a=1
a=1
a=1
.
```
before 和 after 會在所有測試的執行前後做事
```
RSpec.describe "規格說明" do
describe "處於某個狀態下" do
before { puts "before" }
after { puts "after" }
it "1" do
puts "1"
end
it "2" do
puts "2"
end
end
end
```
執行結果
```
before
1
after
.before
2
after
.
```
因為測試對資料庫的操作會互相影響,如果想要確保每個測試都是在資料庫乾淨的狀態下,可以使用 [database_cleaner](https://github.com/DatabaseCleaner/database_cleaner)。
```
require 'database_cleaner'
...
RSpec.configure do |config|
...
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
...
end
```
其中的 before、around 可以參考官網說明文件:[https://relishapp.com/rspec/rspec-core/v/2-13/docs/hooks/before-and-after-hooks#before/after-blocks-defined-in-config-are-run-in-order](https://relishapp.com/rspec/rspec-core/v/2-13/docs/hooks/before-and-after-hooks#before/after-blocks-defined-in-config-are-run-in-order)
如果想要控制 rspec 執行每一個 test 的順序,可以這樣寫:
```
# 這裡是 bash
rspec --order defined
rspec --seed 1
```
詳細的介紹可以參考 [https://relishapp.com/rspec/rspec-core/docs/command-line/order](https://relishapp.com/rspec/rspec-core/docs/command-line/order)
如果想要把結果輸出到檔案,可以這樣寫:
```
# 這裡是 bash
rspec --out result.txt
rspec --format documentation --out result.txt
```
上面兩行會使檔案內容不同,詳細的介紹可以參考 [https://relishapp.com/rspec/rspec-core/v/2-4/docs/command-line/format-option](https://relishapp.com/rspec/rspec-core/v/2-4/docs/command-line/format-option)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言