2011-05-13 40 views
0

我正在遍历网页上的树控件。点击树中的一些节点将改变FRAME_C中的内容,而点击其他节点则不会。如何过滤测试以仅在内容发生变化时运行?这里就是我想:RSpec:您如何基于之前的测试结果隐式过滤测试?

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,因为两个全局变量尚未由前面的测试设置。

有没有办法做我在问什么?我一直在试图弄清楚这几天。

回答

1

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

你应该已经知道前面的视图和当前的视图是不同的,如果不是你所期望的,你会失败。

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

+0

对于单元测试,我同意你的看法。虽然我没有进行单元测试。我使用RSpec来帮助对不属于我的代码进行自动化的黑盒功能测试。它在Ruby中也没有开发出来,这样就使得套牌更加困难。我无法知道哪些节点会改变视图,哪些节点不会改变视图。我已经看到示例中使用的隐式过滤器来检查是否存在网络连接,然后在适当的情况下跳过,我希望能够利用该功能以供我使用。如果没有办法做到这一点,那么我将不得不设计我自己的设计。 – 2011-05-13 22:48:10

+0

我不同意你的看法,如果你想根据输入做一个动态测试,例如,如果输入的某个值必须声明一个行为,而在其他类型的输入中你想声明其他类型的行为,那么你必须有条件地运行测试。 – MaicolBen 2015-07-03 18:16:44

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,这样当测试是运行时它会被调用。

+0

我已经用lambda尝试过它,但从来没有一个符号。既没有达到预期的结果。 RSpec中的“:if”是一种隐式过滤机制,在描述测试时辨别是否运行它们时运行。我希望有一个配置,或者我可以在运行时获得相同的行为。 – 2011-05-13 23:03:32

+0

听起来像一个功能请求。在此之前,你总是可以'返回,除非viewDifferent?'。 – 2011-05-13 23:10:04

+0

抛出'意想不到的回报' – MaicolBen 2015-07-03 17:36:59