3

我的测试有问题。

我有这个规格:

context 'when no section is supplied' do
  it 'raises an ArgumentError regarding the missing section_id argument' do
    expect do
      described_class.with_section
    end.to raise_error(ArgumentError)
      .with_message /wrong number of arguments \(given 0\, expected 1\)/
  end
end

在某些环境中,消息是:

ArgumentError: wrong number of arguments (0 for 1)

在其他环境中,消息是:

ArgumentError: wrong number of arguments (given 0, expected 1)

所以我有一个测试通过我的 Mac 并在另一台计算机上失败。

我怎样才能解决这个问题?

4

2 回答 2

2

差异似乎是由于运行测试的 Ruby 版本所致。Ruby 2.2 及更早的版本会报告此错误并显示如下消息

"ArgumentError: wrong number of arguments (0 for 1)"

Ruby 2.3 报告此错误并显示如下消息

"ArgumentError: wrong number of arguments (given 0, expected 1)"

(这更容易理解)。

对于大多数应用程序来说,解决这个问题的正确方法是在您开发和/或部署程序的所有机器上运行相同版本的 Ruby。让应用程序在 Ruby 的多个主要版本上运行意味着在这些版本上对其进行测试,这意味着在每台开发人员机器上都拥有所有受支持的版本,这比只解决一个版本需要更多的工作。这也意味着放弃新版本的 Ruby 中的好东西。

如果你真的需要你的程序兼容多个版本的 Ruby,你可以测试这个RUBY_VERSION常量:

context 'when no section is supplied' do
  it 'raises an ArgumentError regarding the missing section_id argument' do
    message = RUBY_VERSION.start_with? '2.3' \
      ? "wrong number of arguments (given 0, expected 1)" \
      : "wrong number of arguments (0 for 1)"
    expect { described_class.with_section }.to raise_error(ArgumentError).
      with_message /#{Regexp.escape message}/
  end
end
于 2016-03-09T01:48:03.723 回答
1

为什么不这样做:

.with_message /wrong number of arguments \((0 for 1|given 0, expected 1)\)/
于 2016-03-13T19:10:49.693 回答