Roo D
Roo D

Reputation: 53

Is there a "not" equivalent in rspec, for e.g. the logical not for "and_return"

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

Answers (1)

max
max

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

Related Questions