2017-05-04 107 views
0

我建立具有結構稱爲temp_coverage Rails的規範測試,像這樣:如何在Rails測試中設置對象屬性的方法?

temp_coverage = Struct.new(:paydays) do 
    def calculate_costs 
     50 
    end 
    end 

而在我的天賦,我打電話使用temp_coverage的方法,但我發現了一個錯誤,因爲代碼我測試是做以下:

temp_coverage.req_subscriber_election_amount = subscriber_election_amount 

而且我得到一個錯誤:

NoMethodError: undefined method `req_subscriber_election_amount=' for < struct paydays=12 >

我怎樣才能踩滅了屬性的設置在一個結構我的規格?

回答

1

就是這樣你要找的東西?

temp_coverage = double('temp_coverage', paydays: nil) 

allow(temp_coverage).to receive(:calculate_costs).and_return(50) 
allow(temp_coverage).to receive(:req_subscriber_election_amount=) do |argument| 
    temp_coverage.instance_variable_set(:@req_subscriber_election_amount, argument) 
end 

# Example: 
temp_coverage.req_subscriber_election_amount = 123 
puts temp_coverage.instance_variable_get(:@req_subscriber_election_amount) 
# => 123 
puts temp_coverage.paydays 
# => nil 
puts temp_coverage.calculate_costs 
# => 50 
+0

感謝周杰倫,氬氣,這正是我想什麼來實現的,但是當我運行規範我m得到一個未定義的方法'allow'。這是一個新的rspec命令? –

+0

哦,我想你使用的是舊的rspec。你的rspec版本> = 3? [舊的RSpec參考](https://www.relishapp.com/rspec/rspec/rspec-mocks/v/2-99/docs/) –

+0

挖掘它看起來像我們正在使用摩卡嘲笑,而不是rspec ... –

0

我找到了一種通過使用命名的Struct來完成此操作的方法。所以一旦我叫我的結構:

temp_coverage = Struct.new('CoverageClass', :paydays) do 
    def calculate_costs 
     50 
    end 
    end 

然後我可以做到以下幾點:

Struct::CoverageClass.any_instance.stubs(:req_subscriber_election_amount).returns(25) 
相關問題