Ruby on rails 为一个产生错误的方法编写一个小测试的正确方法是什么?

Ruby on rails 为一个产生错误的方法编写一个小测试的正确方法是什么?,ruby-on-rails,ruby,ruby-on-rails-5,minitest,Ruby On Rails,Ruby,Ruby On Rails 5,Minitest,我在一个类中有一个方法,定义如下: def show_benefits_section? yield if has_any_context? end 我想围绕这一点编写一个测试,到目前为止,我已经有了这个(它可以工作): 我只是不确定这是否是测试该方法的最佳方法。。。 我如何测试阴性条件 任何帮助都将不胜感激 首先,您的代码没有进行任何测试,无论发生什么情况,它都会成功。试着这样做,成功地证明了这一点: [1].each do |first=nil, second=2| a

我在一个类中有一个方法,定义如下:

  def show_benefits_section?
    yield if has_any_context?
  end
我想围绕这一点编写一个测试,到目前为止,我已经有了这个(它可以工作):

我只是不确定这是否是测试该方法的最佳方法。。。 我如何测试阴性条件


任何帮助都将不胜感激

首先,您的代码没有进行任何测试,无论发生什么情况,它都会成功。试着这样做,成功地证明了这一点:

[1].each do |first=nil, second=2|
  assert_equal(1, first)
  assert_equal(2, second)
end
让我解释一下;变量
second
始终为2,因为方法
each
不影响它,默认值设置为2。相比之下,第一个的默认值
nil
被忽略,因为每个都传递一个对象

下面是一个改进的代码片段,用于测试您的案例。 它测试块返回true和false的情况,以及
具有\u any \u上下文?
为true和false的情况。我不认为有一个通用的方法来具体验证区块的屈服值。而是验证方法返回的内容

# Test: :has_any_context? == true 
test_class.stub(:has_any_context?, true) do
  # Test: a block must be given.
  assert_raises(LocalJumpError) { test_class.show_benefits_section? }

  # Test: yield
  [true, false, 5].each do |tobe|
    # If 5 is given, 5 is returned.
    ret = test_class.show_benefits_section? do
      tobe
    end
    assert_equal(tobe, ret)
  end
end

# Test: :has_any_context? == false
test_class.stub(:has_any_context?, false) do
  ret = test_class.show_benefits_section?{true}
  assert_nil(ret)
end
请注意,您的方法
show\u benefits\u section?
返回从块返回的任何内容。我上面的例子也通过给出一个随机值5来测试它。在Ruby的约定中,以“?”结尾的方法名应该返回true或false(尽管存在类似
FileTest.size?
的异常)。如果您想遵循约定,最简单的方法可能是将相关部分重写为

!!yield if has_any_context?

完成此修改后,您可以确认上述测试失败。

谢谢@Masa!几个问题,为什么您的测试数组有
true、false和5
?有什么意义吗?另外,变量
tobe
代表什么?变量
tobe
代表块返回的值,该值在方法
show\u benefits\u部分中产生。您的方法
show\u benefits\u section?
(如您的帖子中所示)将按原样从块返回任何值。答案中的我的代码测试当从给定块返回真/假/5时,方法
show\u benefits\u section?
肯定会分别返回真/假/5。这就是我回答的最后一段所解释的。更正。如果块被读取,您的方法
show\u benefits\u section?
将按原样返回从块返回的任何值。如果未读取块,即
如果有任何上下文?
失败,则返回nil。在我的答案中,测试的最后一部分测试返回nil时的情况。
!!yield if has_any_context?