RSpec + Ruby 3.x - 如何使用不包含特定关键字的关键字参数测试方法调用

问题描述 投票:0回答:1

我有以下方法:

def clone(branch: nil, depth: nil)
  ...
end

对于特定的测试用例,我想测试是否在没有

branch
参数的情况下调用该方法。在 Ruby 2.x 中,以下测试用例运行正常:

it 'clones the created repository without a branch' do
  expect(repository).to receive(:clone).with(hash_excluding(:branch))
  method_call
end

但是在 Ruby 3.x 中这不再起作用,因为:

#<InstanceDouble(Repository) (anonymous)> received :clone with unexpected arguments
  expected: (hash_not_including(:branch=>"anything"))
       got: (no args)

有没有什么方法可以测试这个,而不必更改接收选项哈希而不是关键字参数的方法?我在网上搜索,但我能找到的最接近的东西是 有人希望有

keywords_including
keywords_not_including
匹配器
,但没有具体答案。

在 RSpec 的 Github 存储库上提出问题之前,是否已经有办法执行此测试?


注意: 对于此测试,我不想显式定义任何其他参数,即我不想这样做:

expect(repository).to receive(:clone).with(depth: anything)

我明确想要测试是否缺少

branch
参数。


我尝试像这样扭转期望:

expect(repository).not_to receive(:clone).with(branch: anything)

只要仅使用分支参数调用该方法,这就有效,例如:

clone(branch: 'FETCH_HEAD')

👆 这会使测试按预期失败,但是,一旦添加另一个参数:

clone(branch: 'FETCH_HEAD', depth: 1)

即使调用包含

branch
参数,测试也会通过。

ruby rspec ruby-3
1个回答
0
投票

在发布问题几分钟后找到了答案......为什么总是发生这种情况?

一种可能的方法是:

expect(repository).to receive(:clone) do |**kwargs|
  expect(kwargs).not_to include(:branch)
end

诚然不如单个匹配器那么整洁,但它可以完成工作。

© www.soinside.com 2019 - 2024. All rights reserved.