Một số câu lệnh hay sử dụng khi viết Rspec
Bài đăng này đã không được cập nhật trong 6 năm
Trong bài viết này, mình sẽ trình bày một số câu lệnh rất hay được sử dụng khi viết rspec
Describe, context, it
Describe
- Method Describe tạo ra một example group. Trong khối này bạn có thể lồng vào các example group khác, các ngữ cảnh(context), hoặc là các example bằng cách sử dụng từ khóa
it
hoặcspecify
. - Thường thì describe sẽ dùng để chỉ định một unit mà chúng ta muốn test.
- Ví dụ:
sample_spec.rb
describe "something" do
it "does something" do
end
end
Sau khi chạy rspec rspec sample_spec.rb ta nhận được output
something
does something
Context
- Method context tạo ra một scope, thường được sử dụng để tạo ra ngữ cảnh test.
- Như đã nói phía trên, Context hay được sử dụng ở bên trong scope của describe Ví dụ:
#file_name: "sample_test.rb"
describe "something" do
context "in one context" do
it "does one thing" do
end
end
context "in another context" do
it "does another thing" do
end
end
end
Chạy rspec sample_test.rb
ta nhận được output:
something
in one context
does one thing
in another context
does another thing
it
- Method
it
tạo ra một scope example. Trong scope này, chúng ta thường dùng để tạo ra các object giả định và viết các kì vọng (expect) Ví dụ:
#class User.r
class User
def hello
"hello"
end
end
rpsec:
describe User do
it "#hello"do
expect(User.hello).to eq "hello"
end
end
Let và Let!
Let và Let! là 2 method giúp chúng ta create một object ảo dựa trên activeRecord, không tác động vào database. Object này sẽ được rollback khi bắt đầu một example mới Tuy nhiên, 2 method này có một chút sự khác biệt:
Let
create ra một object, nhưng nó hoạt động theo cơ chế lazy-evaluated, có nghĩa là object đó sẽ không được tạo ra cho đến khi nó được gọi lên lần đầu tiên ở một nơi khác.Let!
thì tạo object ngay khi được chạy Tùy vào ngữ cảnh sử dụng thì ta có thể chọn một trong hai method trên
subject và subject!
- Subject và subject! mô tả đối tượng ẩn mà scope nó nắm trong nhất mô tả (scope tạo ra bởi describe hoặc context)
- Subject! khác với subject ở chỗ là nó sẽ thực thi khối block của nó trước khi chạy các khối example, còn subject sẽ chạy các khối example trước, khi subject được call thì nó mới chạy block của subject
subject{[1, 2, 3]}
subject do
User.new
end
expect và is_expected
Đây là 2 method được sử dụng nhiều nhất, và là trọng tâm của bài test
Ở phiên bản cũ hơn(rspec 2.xx) chúng ta sử dụng từ khóa should
. Nhưng ở các phiên bản mới, chúng ta sử dụng expect
thay thế
-
Method expect và is_expected tạo ra một kì vọng, và chúng ta sẽ mong đợi kì vọng đó đúng hay sai.
-
is_expected là một câu lệnh viết tắt của expect(subject), với is_expected, ta không chú trọng vào đối tượng được test, mà tập chung hơn vào kì vọng của nó. Ví dụ:
class User < ApplicationRecord has_many : posts def arr [1, 2, 3] end end
rspec:
RSpec.describe User, type: :model do it{is_expected.to have_many(:posts)} it{expect(subject.arr).to eq [1, 2, 3]} end
All rights reserved