Ruby on rails 是否有一个“问题”;不是";rspec中的等效值,例如逻辑not for“;和“返回”;

Ruby on rails 是否有一个“问题”;不是";rspec中的等效值,例如逻辑not for“;和“返回”;,ruby-on-rails,rspec,rspec-rails,Ruby On Rails,Rspec,Rspec Rails,在rspec文档中找不到该方法,但是否有替代方法 allow_any_instance_of(<some connection>).to receive(<post method>).and_return(200) 允许()的任何实例接收()并返回(200) 上面的代码块不是返回200,而是返回200。您根本误解了允许的任何实例和返回的操作 用于在给定类的任何实例上存根方法。它不设置任何期望值-expect\u的任何实例都会设置 class Foo def bar

在rspec文档中找不到该方法,但是否有替代方法

allow_any_instance_of(<some connection>).to receive(<post method>).and_return(200)
允许()的任何实例接收()并返回(200)

上面的代码块不是返回200,而是返回200。您根本误解了
允许
的任何实例和
返回的操作

用于在给定类的任何实例上存根方法。它不设置任何期望值-
expect\u的任何实例都会设置

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
。和_return
用于设置模拟/存根的返回值。它并不像你认为的那样,设定了回报值的期望值

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
当您想监视一个方法而不更改其返回值时,可以使用
。和_call_original
。默认情况下,任何以
allow\u any\u instance\u/expect\u any\u instance
为存根的方法都将返回nil

AFAIK不可能对
和_call_original
的返回值设置期望值。这就是为什么
的任何实例都被认为是一种代码气味,应该避免的原因之一