2013-01-02 24 views

Trả lời

14

Tôi luôn luôn thích để cho một biến Ví dụ cho một vài lý do:

  • biến Instance đi vào sự tồn tại khi họ nhận được tham chiếu mà có nghĩa rằng nếu bạn thực hiện bất kỳ sai lầm trong trường hợp biến chính tả rồi nó chắc chắn sẽ dẫn bạn đến một số vấn đề như một biến cá thể mới được khởi tạo thành không. Nhưng để cho bạn sẽ nhận được NameError nếu bạn viết sai chính tả.

  • Hơn nữa bạn sẽ được khởi tạo các biến Ví dụ trước khi khối, có nghĩa là trước khi khối sẽ được thực hiện mỗi khi một spec sẽ chạy ngay cả khi thông số này không sử dụng các biến dụ bạn đã khởi tạo. ví dụ dưới đây;

    before do 
        @user = Factory :user 
        @movie = Factory :movie 
    end 
    
    it "should have user" do 
        @user.should eq User.first 
    end 
    
    it "should have movie" do 
        @movie.should eq Movie.first 
    end 
    

Mặc dù tất cả các thông số kỹ thuật chạy tốt nhưng có được không sử dụng của @movie trong spec đầu tiên và không sử dụng @user thứ hai.

Bạn cũng có thể sử dụng let with bang "!" let!, let được đánh giá lazily và sẽ không bao giờ được khởi tạo nếu bạn không gọi nó, sử dụng let để xác định trình trợ giúp ghi nhớ, trong khi let! được đánh giá mạnh trước mỗi cuộc gọi phương thức.

+2

Có lẽ ông muốn nói như thế này: tại tất cả các điểm, 'let' là một lợi thế cho các biến dụ và luôn luôn là thuận lợi hơn so biến ví dụ. –

7

Tôi đã ưu tiên câu hỏi này, nhưng cuối cùng tôi tự trả lời câu hỏi đó.

Đầu tiên để mô tả sự khác biệt

Phương pháp let khi sử dụng nó không khởi tạo biến cho đến khi nó được tham chiếu trong các thử nghiệm - mà làm cho nó khác với @instance variables được khởi tạo từ đầu.

Nói chung không có sự khác biệt lớn. Sử dụng @instance variables khi bạn muốn chắc chắn rằng đối tượng let được khởi tạo. Nhưng mặt khác, điều này có thể được thực hiện tương tự với let!, vì vậy không có lý do rõ ràng để sử dụng @instance variable.

Để kết luận, với tôi, đó là rõ ràng lý do để sử dụng @instance variable qua let, nhưng không có lý do rõ ràng để sử dụng @instance variables qua let!

@instance variables mất nhiều thời gian để tải, và bằng cách sử dụng chúng, có thể dẫn đến sự phức tạp không cần thiết trong mã mà có thể tránh được bằng cách sử dụng let hoặc let!

bạn có thể có một cái nhìn tại hai câu trả lời này là tốt, có thể nó sẽ cung cấp cho bạn một số thông tin:

When to use RSpec let()?

RSpec: What is the difference between let and a before block?

Các vấn đề liên quan