如何在Rails测试中设置对象属性的方法?
问题描述:
我建立具有结构称为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 >
我怎样才能踩灭了属性的设置在一个结构我的规格?
答
就是这样你要找的东西?
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
答
我找到了一种通过使用命名的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)
感谢周杰伦,氩气,这正是我想什么来实现的,但是当我运行规范我m得到一个未定义的方法'allow'。这是一个新的rspec命令? –
哦,我想你使用的是旧的rspec。你的rspec版本> = 3? [旧的RSpec参考](https://www.relishapp.com/rspec/rspec/rspec-mocks/v/2-99/docs/) –
挖掘它看起来像我们正在使用摩卡嘲笑,而不是rspec ... –