Ruby RSpec:如何根据先前测试的结果隐式过滤测试?

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

我正在遍历网页上的树控件。单击树中的某些节点将更改框架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
将从块返回。