【发布时间】:2021-03-31 18:31:49
【问题描述】:
我正在尝试模拟一个类,以便我可以期望它被实例化,然后调用某个方法。
我试过了:
expect(MyPolicy).
to receive(:new).
and_wrap_original do |method, *args|
expect(method.call(*args)).to receive(:show?).and_call_original
end
但我得到的只是:
未定义的方法“显示?”对于#RSpec::Mocks::VerifyingMessageExpectation:0x0055e9ffd0b530
我尝试过提供一个块并首先调用原始方法(:new 和 :show?,我必须先绑定),但错误始终相同。
我知道expect_any_instance_of,但它被认为是代码异味,所以我正在尝试另一种方法来正确地做到这一点。
上下文:我有权威政策,我想检查它是否已被调用
我也试过了,同样的错误:
ctor = policy_class.method(:new)
expect(policy_class).
to receive(:new).
with(user, record) do
expect(ctor.call(user, record)).to receive(query).and_call_original
end
【问题讨论】:
-
返回一个双精度并在那里添加一个期望怎么样?
expect(MyPolicy).to(receive(:new).and_return(double(:scope).tap { |scope| expect(scope).to receive(:show?) })) -
@SebastianPalma 在这种情况下可以调用原始方法吗?感谢您的提示!
-
也许在
receive(:show)之后添加一个.and_call_original,因为如果你实例化MyPolicy你会收到一个不同的对象,所以无论如何你都需要设置两个期望. -
我也试过了,但没有成功。我又添加了一次尝试
-
我认为在您进行的最后一次更新中,该块设置了对
self的期望,而不是在调用new后policy_class返回的期望。如果您添加一个最小复制方案,我们可以更好地了解您的问题。
标签: ruby rspec pundit rspec-mocks