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

时间:2011-05-13 21:57:45

标签: ruby rspec rspec2

我在网页上迭代树控件。单击树中的某些节点将更改FRAME_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在执行任何测试之前正在评估所有测试的过滤器。在上面的例子中viewDifferent?将始终(并且确实)返回false,因为前两个测试尚未设置两个全局变量。

有没有办法做我要问的事情?我已经试图解决这个问题好几天了。

2 个答案:

答案 0 :(得分:1)

应始终运行测试。它应该设置执行您期望的代码路径所需的状态。在我看来,根据其他测试的结果有条件地执行测试完全打破了测试的精神。

您应该已经知道上一个视图和当前视图是不同的,如果不是您所期望的,那么您将失败。

每个测试都应该在您期望它执行的代码中有一个非常具体的路径,如果没有,您应该失败。没有办法做你想做的事,因为你不应该这样做。

答案 1 :(得分:0)

我不熟悉w / rspec,但您尝试使用Proc吗?例如......

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,以便在测试运行时调用它。