Tôi hiểu sự khác biệt giữa let
và let!
với một ví dụ rất đơn giản. Hãy để tôi đọc câu doc trước, sau đó đưa tay ra.
About let doc nói: -
... let
là lười biếng đánh giá lại: nó không được đánh giá cho đến khi lần đầu tiên phương pháp xác định nó được gọi.
tôi hiểu sự khác biệt với các ví dụ dưới đây: -
$count = 0
describe "let" do
let(:count) { $count += 1 }
it "returns 1" do
expect($count).to eq(1)
end
end
Cho phép chạy ngay bây giờ: -
[email protected]:~/Ruby> rspec spec/test_spec.rb
F
Failures:
1) let is not cached across examples
Failure/Error: expect($count).to eq(1)
expected: 1
got: 0
(compared using ==)
# ./spec/test_spec.rb:8:in `block (2 levels) in <top (required)>'
Finished in 0.00138 seconds (files took 0.13618 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/test_spec.rb:7 # let is not cached across examples
[email protected]:~/Ruby>
Tại sao LỖI? Bởi vì, như doc đã nói, với let
, nó không được đánh giá cho đến khi lần đầu tiên phương thức nó định nghĩa được gọi. Trong ví dụ , chúng tôi đã không gọi số count
, do đó $count
vẫn là 0
, không tăng thêm 1
.
Bây giờ, hãy đến phần let!
. Tài liệu đang nói
.... Bạn có thể sử dụng cho phép! để buộc lời gọi của phương thức trước mỗi ví dụ. Điều đó có nghĩa là ngay cả khi bạn không gọi phương thức trợ giúp bên trong ví dụ , vẫn sẽ được gọi trước khi ví dụ của bạn chạy.
Cho phép kiểm tra này cũng: -
Đây là mã sửa đổi
$count = 0
describe "let" do
let!(:count) { $count += 1 }
it "returns 1" do
expect($count).to eq(1)
end
end
Cho phép chạy mã này: -
[email protected]:~/Ruby> rspec spec/test_spec.rb
.
Finished in 0.00145 seconds (files took 0.13458 seconds to load)
1 example, 0 failures
Xem, bây giờ $count
lợi nhuận 1
, do đó kiểm tra đã được thông qua. Nó xảy ra khi tôi sử dụng let!
, chạy trước khi chạy ví dụ, mặc dù chúng tôi đã không gọi count
bên trong ví dụ của chúng tôi.
Đây là cách let
và let!
khác nhau.
Đồng ý, đó là lý do tại sao thông số đầu tiên có ý nghĩa. Chắc chắn, mặc dù, spec thứ hai sẽ được đánh giá trước khi ví dụ, (làm cho nó bằng 1) và sau đó một lần nữa khi gọi "count.should" (làm cho nó bằng 2)? –
Không, nó đã được gọi và ghi nhớ, do đó, số lượng $ không tăng trở lại. Dù sao, nếu bạn có một ví dụ khác, móc trước được gọi lại. Xem câu trả lời đã chỉnh sửa của tôi, tôi đã thêm một số mã để làm rõ. – dhoelzgen
Vì vậy, điều đó có nghĩa rằng nếu bạn sử dụng "let" và một spec (một "nó") không doa "đếm.nên "(hoặc tương tự) sau đó tăng sẽ không diễn ra? Nếu đó là trường hợp, sau đó" cho "không nên được coi là một" trước ", vì trước đây theo mặc định ngụ ý các chức năng của" cho phép! "Hoặc Tôi bị mất một cái gì đó một lần nữa? –