2010-02-14 33 views
5

Vì vậy, tôi khá mới với ruby ​​nói chung, và tôi đang viết một số trường hợp thử nghiệm rspec cho một đối tượng tôi đang tạo ra. Rất nhiều trường hợp thử nghiệm khá cơ bản và tôi chỉ muốn đảm bảo rằng các giá trị đang được phổ biến và trả về đúng. Tôi tự hỏi nếu có một cách để tôi làm điều này với một cấu trúc lặp. Thay vì phải có một assertEquals cho mỗi phương thức tôi muốn kiểm tra.Làm thế nào để chạy phương thức đối tượng tùy ý từ chuỗi trong ruby?

Đối với instace:

describe item, "Testing the Item" do 

    it "will have a null value to start" do 
    item = Item.new 
    # Here I could do the item.name.should be_nil 
    # then I could do item.category.should be_nil 
    end 

end 

Nhưng tôi muốn có một số cách để sử dụng một mảng để xác định tất cả các thuộc tính để kiểm tra. Vì vậy, tôi có thể làm một cái gì đó như

propertyArray.each do |property| 
    item.#{property}.should be_nil 
end 

Điều này hoặc một cái gì đó giống như nó hoạt động? Cảm ơn bạn đã giúp đỡ/gợi ý.

Trả lời

6

object.send(:method_name) hoặc object.send("method_name") sẽ hoạt động.

Vì vậy, trong trường hợp của bạn

propertyArray.each do |property| 
    item.send(property).should be_nil 
end 

nên làm những gì bạn muốn.

+0

Cảm ơn! Tôi biết phải có một cách để làm điều đó. – Boushley

1

Nếu bạn làm

propertyArray.each do |property| 
    item.send(property).should be_nil 
end 

trong vòng một ví dụ đặc tả đơn và nếu spec của bạn thất bại thì nó sẽ được khó khăn để gỡ lỗi mà thuộc tính không phải là con số không hoặc những gì đã thất bại. Một cách tốt hơn để làm điều này là để tạo ra một ví dụ đặc tả riêng cho từng thuộc tính như

describe item, "Testing the Item" do 

    before(:each) do 
    @item = Item.new 
    end 

    propertyArray.each do |property| 

    it "should have a null value for #{property} to start" do 
     @item.send(property).should be_nil 
    end 

    end 

end 

này sẽ chạy spec của bạn là một ví dụ đặc tả khác nhau cho mỗi tài sản và nếu nó không thành công thì bạn sẽ biết những gì đã thất bại. Điều này cũng tuân theo quy tắc của một xác nhận cho mỗi ví dụ thử nghiệm/spec.

1

Một vài điểm về Object#send() ...

Bạn có thể chỉ định các thông số cho các cuộc gọi phương pháp quá ...

an_object.send(:a_method, 'A param', 'Another param') 

Tôi thích sử dụng hình thức này khác __send__ vì "gửi" là quá phổ biến ...

an_object.__send__(:a_method) 
Các vấn đề liên quan