2011-11-14 34 views
19

Giả sử bạn có một trang web mua bán vật dụng. Tuy nhiên, khoảng không quảng cáo của mỗi tiện ích bị giới hạn, vì vậy điều quan trọng là giữ cho số "widget.number_still_available" được cập nhật.Khi thử nghiệm với rspec, nơi để đặt phổ biến "phương pháp thử nghiệm tiện ích"?

Tôi muốn viết một bài kiểm tra rspec dọc theo dòng của

it "always displays the correct number still available" do 

    # Assume there is a before method that sets up a widget with 5 available 

    widget.number_still_available.should == 5 

    # User "[email protected]" purchases 2 widgets 
    widget.number_still_available.should == 3 

    # User "[email protected]" purchases 1 widget 
    widget.number_still_available.shhould == 2 

    # User "[email protected]" cancels purchase of 1 widget 
    widget.number_still_available.should == 4 
end 

Tôi muốn để có thể viết thử nghiệm chỉ phương pháp mà thực hiện việc "mua" và "hủy" phương pháp. Những hành động này không tương ứng với bất kỳ phương thức "thực" nào trong các mô hình của tôi vì nhiều lý do (đáng kể nhất là có một hệ thống back-end được tách riêng trong PHP thực hiện một phần hành động mua và hủy).

Địa điểm chính xác để đặt mã này khi sử dụng RSpec ở đâu? Trong dưa chuột, tôi có thể viết một vài bước - nhưng tôi không chắc những gì tương đương chính xác là cho RSpec.

Trả lời

40

tôi sẽ đề nghị thực hiện một tập tin mới trong spec/support gọi purchase_helpers.rb và đưa nội dung này trong đó:

module PurchaseHelpers 
    def purchase_widgets(user, count=1) 
    # Code goes here 
    end 

    def cancel_purchase(user, count=1) 
    # Code goes here 
    end 
end 

RSpec.configure do |c| 
    c.include PurchaseHelpers 
end 

Lợi ích của việc làm này hơn là chucking nó vào spec/spec_helper.rb là nó không được tụ tập lên tập tin đó với rất nhiều mã không liên quan đến thiết lập-của-RSpec. Tách ra mọi thứ là cách tốt hơn để làm mọi thứ.

+1

Lưu ý rằng nó cũng hoạt động với các lớp mô hình vá khỉ trong cùng một tệp này. Vì vậy, nếu bạn ưa thích 'purchase_widgets' thành phương thức chỉ thử nghiệm trên Người dùng, bạn có thể mở lớp Người dùng trong tệp này và thêm nó. Ngoài ra, để thuận tiện hơn, nếu bạn đang thử nghiệm với Spork, bạn có thể muốn thêm 'load" # {Rails.root} /spec/support/purchase_helpers.rb "' vào trong khối 'Spork.each_run' trong spec_helper.rb. – cailinanne

+1

Đó là bit cuối cùng chỉ cần thiết nếu bạn muốn bao gồm các phương thức 'PurchaseHelper' trong không gian tên của tất cả các thông số kỹ thuật. Nếu bạn chỉ muốn thực hiện khi cần, bạn có thể gọi 'bao gồm PurchaseHelpers' trong khối' description' của bạn. –

2

Bạn có thể thả một monkeypatch vào spec_helper.rb hoặc trực tiếp ở đầu tệp spec nếu nó chỉ được sử dụng cho một tệp đó.

Sẽ rõ ràng hơn và an toàn hơn khi tạo các phương thức trợ giúp sử dụng các phương thức lớp hiện có, thay vì sử dụng các lớp con khỉ.

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