RSpec - Hooks
Khi bạn đang viết các bài kiểm tra đơn vị, việc chạy mã thiết lập và chia nhỏ trước và sau các bài kiểm tra của bạn thường rất tiện lợi. Mã thiết lập là mã định cấu hình hoặc “thiết lập” các điều kiện cho một bài kiểm tra. Mã Teardown thực hiện dọn dẹp, nó đảm bảo rằng môi trường ở trạng thái nhất quán cho các thử nghiệm tiếp theo.
Nói chung, các bài kiểm tra của bạn nên độc lập với nhau. Khi bạn chạy toàn bộ bộ thử nghiệm và một trong số chúng không thành công, bạn nên tin rằng nó không thành công vì mã mà nó đang kiểm tra có lỗi, không phải vì thử nghiệm trước đó khiến môi trường ở trạng thái không nhất quán.
Các hook phổ biến nhất được sử dụng trong RSpec là hook trước và sau. Chúng cung cấp một cách để xác định và chạy mã thiết lập và xé nhỏ mà chúng ta đã thảo luận ở trên. Hãy xem xét mã ví dụ này -
class SimpleClass
attr_accessor :message
def initialize()
puts "\nCreating a new instance of the SimpleClass class"
@message = 'howdy'
end
def update_message(new_message)
@message = new_message
end
end
describe SimpleClass do
before(:each) do
@simple_class = SimpleClass.new
end
it 'should have an initial message' do
expect(@simple_class).to_not be_nil
@simple_class.message = 'Something else. . .'
end
it 'should be able to change its message' do
@simple_class.update_message('a new message')
expect(@simple_class.message).to_not be 'howdy'
end
end
Khi bạn chạy mã này, bạn sẽ nhận được kết quả sau:
Creating a new instance of the SimpleClass class
.
Creating a new instance of the SimpleClass class
.
Finished in 0.003 seconds (files took 0.11401 seconds to load)
2 examples, 0 failures
Chúng ta hãy xem xét kỹ hơn những gì đang xảy ra. Phương thức before (: each) là nơi chúng ta xác định mã thiết lập. Khi bạn truyền: mỗi đối số, bạn đang hướng dẫn phương thức before chạy trước mỗi ví dụ trong Nhóm ví dụ của bạn, tức là hai đối số mà nó chặn bên trong khối mô tả trong đoạn mã trên.
Trong dòng: @simple_class = SimpleClass.new, chúng tôi đang tạo một thể hiện mới của lớp SimpleClass và gán nó cho một biến thể hiện của một đối tượng. Bạn có thể thắc mắc đối tượng nào? RSpec tạo ra một lớp đặc biệt đằng sau hậu trường trong phạm vi của khối mô tả. Điều này cho phép bạn gán giá trị cho các biến cá thể của lớp này, mà bạn có thể truy cập trong các khối nó trong Ví dụ của bạn. Điều này cũng giúp bạn dễ dàng viết mã sạch hơn trong các thử nghiệm của chúng tôi. Nếu mỗi bài kiểm tra (Ví dụ) cần một thể hiện của SimpleClass, chúng ta có thể đặt mã đó vào trước hook và không phải thêm nó vào mỗi ví dụ.
Lưu ý rằng, dòng "Tạo một phiên bản mới của lớp SimpleClass" được ghi vào bảng điều khiển hai lần, điều này cho thấy rằng, trước khi hook được gọi trong mỗi it blocks.
Như chúng ta đã đề cập, RSpec cũng có dấu móc sau và cả dấu móc trước và sau đều có thể lấy: tất cả như một đối số. Sau hook sẽ chạy sau target được chỉ định. Mục tiêu: all có nghĩa là hook sẽ chạy trước / sau tất cả các Ví dụ. Đây là một ví dụ đơn giản minh họa khi mỗi hook được gọi.
describe "Before and after hooks" do
before(:each) do
puts "Runs before each Example"
end
after(:each) do
puts "Runs after each Example"
end
before(:all) do
puts "Runs before all Examples"
end
after(:all) do
puts "Runs after all Examples"
end
it 'is the first Example in this spec file' do
puts 'Running the first Example'
end
it 'is the second Example in this spec file' do
puts 'Running the second Example'
end
end
Khi bạn chạy đoạn mã trên, bạn sẽ thấy đầu ra này:
Runs before all Examples
Runs before each Example
Running the first Example
Runs after each Example
.Runs before each Example
Running the second Example
Runs after each Example
.Runs after all Examples