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?