Reputation: 53
Couldn't find the method in the rspec docs, but is there an alternative to do this?
allow_any_instance_of(<some connection>).to receive(<post method>).and_return(200)
the above code block to not return 200 instead
Upvotes: 1
Views: 129
Reputation: 102250
You have fundamentally misunderstood what allow_any_instance_of
and to_return
do.
allow_any_instance_of
is used to stub a method on any instance of a given class. It does not set any expectations - expect_any_instance_of
does.
class Foo
def bar(*args)
"baz"
end
end
RSpec.describe Foo do
describe "allow_any_instance_of" do
it "does not create an expectation" do
allow_any_instance_of(Foo).to receive(:bar).and_call_original
expect(true).to be_truthy
end
end
describe "expect_any_instance_of" do
it "sets an expectation" do
expect_any_instance_of(Foo).to receive(:bar).and_call_original
expect(Foo.new.bar).to eq 'baz'
end
# this example will fail
it "fails if expected call is not sent" do
expect_any_instance_of(Foo).to receive(:bar).and_call_original
expect(true).to be_truthy
end
end
end
.and_return
is used to set the return value of a mock/stub. It does not as you seem to believe set an expectation on the return value.
RSpec.describe Foo do
describe "and_return" do
it "changes the return value" do
allow_any_instance_of(Foo).to receive(:bar).and_return('hello world')
expect(Foo.new.bar).to_not eq 'baz'
expect(Foo.new.bar).to eq 'hello world'
end
end
end
You can use .and_call_original
when you want to spy on a method without changing its return value. By default any method stubbed with allow_any_instance_of/expect_any_instance
will return nil.
AFAIK its not possible to set an expectation on what the return value of .and_call_original
is. Thats one of reasons why any_instance_of
is considered a code smell and should be avoided.
Upvotes: 1