我有以下方法:
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
参数,测试也会通过。
我在发布问题几分钟后找到了答案......为什么总是发生这种情况?
一种可能的方法是:
expect(repository).to receive(:clone) do |**kwargs|
expect(kwargs).not_to include(:branch)
end
诚然不如单个匹配器那么整洁,但它可以完成工作。