Làm cách nào để xác minh Foobar#some_method
Cho dù nó chiếm một khối. Tương tự như Foobar.new.respond_to?(:some_method)
lớp học Foobar
chắc chắn một số_method
năng suất
end
end
为什么?
Điều này rất hữu ích cho việc thử nghiệm các giao diện hợp đồng. Đảm bảo phương thức sơ khai của tôi có API không thay đổi.
Những gì tôi đã thử
mth = Foobar.new.method(:some_method)
mth.parameter
Điều này trả về một danh sách tham số (về cơ bản Rspec sử dụng). Nếu tôi có một tham số khối như thế này thì nó hoạt động:
def some_method(&blk)
end
Nhưng nếu một phương pháp sử dụng năng suất
Thay vào đó, tôi bắt đầu với #thông số
Không có gì đạt được.
Điều này nhằm bổ sung các thông số kỹ thuật để đảm bảo giao diện với thế giới bên ngoài xấu xí. Vì vậy, tôi biết một phương pháp hoạt động như thế nào. Nhưng nếu có thay đổi về API, tôi muốn thông số kỹ thuật không thành công.
Làm cách nào tôi có thể xác minh nếu Foobar#some_method
mất một khối.
mọi thứ đều bằng ruby Tất cả các phương thức đều yêu cầu (có thể sử dụng) một khối. Nó có thể đơn giản chọn không nhượng bộ. Vì vậy, tôi nghĩ đó là điều bạn cần kiểm tra: liệu phương pháp đó có thành công hay không.
RSpec có nhiều kỳ vọng đầu ra:https://relishapp.com/rspec/rspec-expectations/docs/build-in-matchers/yield-matchers
RSpec.describe "trình so khớp năng suất_control" làm
chỉ định { mong đợi { |b|
chỉ định { mong đợi { |b|
chỉ định { mong đợi { |b|
chỉ định { mong đợi { |b| MyClass.yield_twice_with(1, &b) }.to energy_control.exactly(2).time }
chỉ định { mong đợi { |b| MyClass.yield_twice_with(1, &b) }.to energy_control.at_least(1) }
chỉ định { mong đợi { |b| MyClass.yield_twice_with(1, &b) }.to energy_control.at_most(3).time }
end
Vì vậy, đối với trường hợp của bạn, nó sẽ trông như thế này:
mong đợi{ foobar.some_method}.to energy_control
Tôi là một lập trình viên xuất sắc, rất giỏi!