Một số câu lệnh hay sử dụng khi viết Rspec
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 ...
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ặc specify.
- 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