2016-07-29 121 views
0

我正在使用Ruby 2.2.1和Rails 4.2.0Rspec測試重用對象

我正在添加測試用例來覆蓋模塊。該模塊基本上對從另一個系統提取的數據執行一些QA檢查。我遇到的問題是跨越測試用例,模塊內部的迭代重複使用同一個對象,而不是各個測試用例的單個對象。

樣品測試情況:

... 

it "should add issue case 1" do 
    trip = FactoryGirl.build(:trip, :case_1) 
    p trip.object_id # 7...8660 
    subject.do_qa(trip) 
    expect(trip.issue_1).not_to be_nil 
end 

it "should add issue case 2" do 
    trip = FactoryGirl.build(:trip, :case_2) 
    p trip.object_id # 7...2780 
    subject.do_qa(trip) 
    expect(trip.issue_2).not_to be_nil 
end 

... 

樣本模塊:

module Qa 

    ... 

    def self.do_qa(trips) 
    p trips.object_id # Same is the object id in the calling test case 
    @trips ||= Array.wrap(trips) 
    @trips.each do |t| 
     p t.object_id # Always the object id from the first test case! 
     ... # Checks for case 1 and case 2 
    end 
    end 

    ... 

end 

由於環路重新使用對象,第二測試情況下從未通過,因爲該模塊只是重新評估第一個trip對象。有沒有辦法強制它在循環中實例化一個新對象?

+0

有一個可怕的方法,可能有更好的方法,但我們需要看到更多的代碼。 'Qa'中的其他方法是指'@ trips'?什麼課包括'Qa'?測試中的「主題」是什麼? ([RSpec的主題大多是一件壞事。](http://stackoverflow.com/questions/38437162/whats-the-difference-between-rspecs-subject-and-let-when-should-they-be-used) ) –

回答

0

對此的回答最終導致我對Ruby和其他語言缺乏完全理解。基本上,即使Module沒有被定義爲一個類,它仍然是一個幕後的類,實例變量在運行之間保持設置。這在我的應用程序中沒有問題,因爲沒有任何東西依賴於它們在方法調用之間被清除。

案例1和案例2在原來的問題實際上是使用Qa類的同一個實例,所以當然的實例變量是怎麼回事,因爲我用的是||=運營商仍然包含原來的trip對象。

我解決了這個問題,在Qa.instance_variable_set(:@trips, [])的相關上下文的開頭添加了一個before(:each)塊,以確保該變量以乾淨狀態啓動。

+0

是的,或者你可以做適當的OOP,而不是以全局狀態存儲數據。意思是,實際實例化一個'Qa'類並且使用__instance__而不是__class__。 –