ibp*_*pix 3 rspec ruby-on-rails
我正在尝试存根这样的方法:
allow(Flipper).to receive(:enabled?).with(:premium_plus_features_beta).and_return(false)
Run Code Online (Sandbox Code Playgroud)
但是当它遇到不同的参数时 - 它会给我一个像这样的错误:
#<Flipper (class)> received :enabled? with unexpected arguments
expected: (:premium_plus_features_beta)
got: (:non_advertiser_profile_amp, {:lawyer_id=>4469860})
Diff:
@@ -1,2 +1,2 @@
-[:premium_plus_features_beta]
+[:non_advertiser_profile_amp, {:lawyer_id=>4469860}]
Run Code Online (Sandbox Code Playgroud)
我通常不会存根这么多,但是为什么当我明确地告诉它参数时,为什么它会在不同的参数上出错?他们显然不一样。这只是一些语法问题吗?
我尝试了这个,但不起作用 https://makandracards.com/makandra/30543-rspec-only-stub-a-method-when-a-pspecial-argument-is-passed
Flipper.should_receive(:enabled?).and_call_original
Flipper.should_receive(:enabled?).with(:premium_plus_features_beta).and_return(false)
Run Code Online (Sandbox Code Playgroud)
当使用特定参数存根方法时,您只是使用这些特定参数存根该特定方法调用。对该方法的所有其他调用都将失败并出现错误:
#<Foo (class)> received :bar with unexpected arguments
Run Code Online (Sandbox Code Playgroud)
正如OP所发现的,这里的解决方案是首先使用该and_call_through方法对对象的所有调用进行存根,然后使用您希望存根的特定参数对特定调用进行存根。
从OP的答案来看,第一行存根对Flipper对象的所有调用,并允许它们调用底层代码,第二行存根接收:premium_plus_features_beta和返回的调用false:
allow(Flipper).to receive(:enabled?).and_call_original
allow(Flipper).to receive(:enabled?).with(:beta).and_return(false)
Run Code Online (Sandbox Code Playgroud)
另外,这里还有一点需要说明。OP 问题中的代码使用了旧的 RSpec 期望语法。OP 答案中的代码使用新的 RSpec 存根语法。所以,当代码这样说时:
Flipper.should_receive(:enabled?).and_call_original
Flipper.should_receive(:enabled?).with(:beta).and_return(false)
Run Code Online (Sandbox Code Playgroud)
它所做的事情是这样的:
expect(Flipper).to have_received(:enabled?).and_call_original
expect(Flipper).to have_received(:enabled?).with(:beta).and_return(false)
Run Code Online (Sandbox Code Playgroud)
这与我认为OP真正想做的完全不同:
before do
allow(Flipper).to receive(:enabled?).and_call_original
allow(Flipper).to receive(:enabled?).with(:beta).and_return(enabled?)
end
context "when the beta is disabled" do
let(:enabled?) { false }
it "hides the beta" do
...
end
end
context "when the beta is enabled" do
let(:enabled?) { true }
it "shows the beta" do
...
end
end
Run Code Online (Sandbox Code Playgroud)
最后,对于那些好奇为什么 RSpec 改变语法的人...旧语法需要猴子补丁Object才能添加该should_receive方法。我认为 RSpec 团队更喜欢新语法,因为它不再需要猴子补丁。
| 归档时间: |
|
| 查看次数: |
5482 次 |
| 最近记录: |