Mark Kadlec
Mark Kadlec

Reputation: 8460

How to stub a method that sets an object attribute in a Rails test?

I'm building a Rails spec test that has a Struct called temp_coverage, like this:

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

And in my spec, I call a method using the temp_coverage, but I'm getting an error since the code I am testing is doing the following:

temp_coverage.req_subscriber_election_amount = subscriber_election_amount

And I am getting an error:

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

How can I stub out the setting of an attribute on a struct in my spec?

Upvotes: 0

Views: 1604

Answers (2)

Mark Kadlec
Mark Kadlec

Reputation: 8460

I found a way to do this by using a named Struct. So once I named my Struct:

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

I could then do the following:

Struct::CoverageClass.any_instance.stubs(:req_subscriber_election_amount).returns(25)

Upvotes: 0

Jay-Ar Polidario
Jay-Ar Polidario

Reputation: 6603

Is something like this you're looking for?

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

Upvotes: 1

Related Questions