Ruby RSpec:如何根据先前测试的结果隐式过滤测试?
我正在遍历网页上的树控件。单击树中的某些节点将更改框架C中的内容,而单击其他节点则不会。如何筛选测试,使其仅在内容更改时运行?以下是我正在尝试的:Ruby RSpec:如何根据先前测试的结果隐式过滤测试?,ruby,rspec,rspec2,Ruby,Rspec,Rspec2,我正在遍历网页上的树控件。单击树中的某些节点将更改框架C中的内容,而单击其他节点则不会。如何筛选测试,使其仅在内容更改时运行?以下是我正在尝试的: def viewDifferent? if $prvView != $curView return true else return false end end ... describe "Exercising View" do it "clicks a node in the tree c
def viewDifferent?
if $prvView != $curView
return true
else
return false
end
end
...
describe "Exercising View" do
it "clicks a node in the tree control" do
$prvView = $b.frame( :id, 'FRAME_C').document.body.innertext
Timeout.timeout(50) do
spn.fire_event('onmouseup')
end
$curView = $b.frame( :id, 'FRAME_C').document.body.innertext
end
it "Runs only if the view is different", :if => viewDifferent? do
puts "Doing some stuff."
end
end
我的问题是,RSpec在执行任何测试之前都在评估我所有测试的过滤器。在上面的例子中,视图不同吗?将始终(并且确实)返回false,因为这两个全局变量尚未由上一个测试设置
有没有办法做到我的要求?我已经想了好几天了。测试应该一直运行。它应该设置执行预期代码路径所需的状态。在我看来,根据其他测试的结果有条件地执行测试完全破坏了测试的精神 您应该已经知道上一个视图和当前视图是不同的,如果不是您所期望的,那么您就失败了
每个测试都应该有一个非常特定的路径,通过您希望它执行的代码,如果没有,您应该失败。没有一种方法可以做你想做的事情,因为你不应该这样做。我不熟悉w/rspec,但是你试过使用
程序吗?例如
it "Runs only if the view is different", :if => lambda { viewDifferent? } do
puts "Doing some stuff."
end
作为速记的符号甚至可以工作
it "Runs only if the view is different", :if => :viewDifferent? do
puts "Doing some stuff."
end
正如您目前所拥有的,它会在声明测试后立即调用viewDifferent?
方法。您真正想要的是通过Proc
,以便在测试运行时调用它。对于单元测试,我同意您的看法。但是我没有做单元测试。我使用RSpec来帮助对非我的代码进行自动化、黑盒、功能测试。它也不是在Ruby中开发的,所以它的堆叠会更进一步。我无法知道哪些节点会改变视图,哪些节点不会。我在示例中看到了隐式过滤器,用于检查是否存在网络连接,然后在适当的情况下跳过,我希望也能利用该功能。我不同意你的观点,如果你想基于输入进行动态测试,例如,如果输入的某个值必须声明一种行为,而在其他类型的输入中,你想声明其他类型的行为,你必须有条件地运行测试。我用lambda试过,但从来没有符号。两者都没有达到预期的效果。RSpec中的“:if”是一种隐式过滤机制,在描述测试时运行该机制,以识别是否运行测试。我希望有一个配置,或者其他我可以做的事情来在运行时获得相同的行为。听起来像是一个功能请求。在此之前,您始终可以返回除非viewDifferent?
。抛出意外返回
@MaicolBen,尝试下一步除非viewDifferent?
。使用next
将从块返回。