【问题标题】:RSpec: How do you implicitly filter tests based on the outcome of a previous test?RSpec:您如何根据先前测试的结果隐式过滤测试?
【发布时间】:2011-05-14 06:51:33
【问题描述】:

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

有没有办法按照我的要求做?这几天我一直在努力解决这个问题。

【问题讨论】:

    标签: ruby rspec rspec2


    【解决方案1】:

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

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

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

    【讨论】:

    • 对于单元测试我同意你的看法。我没有做单元测试。我正在使用 RSpec 来帮助对不属于我的代码进行自动化、黑盒、功能测试。它也不是在 Ruby 中开发的,因此对我来说更加不利。我无法知道哪些节点会改变视图,哪些不会。我已经看到示例中使用的隐式过滤器来检查是否存在网络连接,然后在适当的情况下跳过,我希望也可以利用该功能。如果没有办法做到这一点,那么我想我将不得不自己设计。
    • 我不同意你的观点,如果你想根据输入进行动态测试,例如,如果输入的某个值必须断言行为并且在其他类型的输入中你想要断言其他类型的行为,你必须有条件地运行测试。
    【解决方案2】:

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

    【讨论】:

    • 我已经尝试过使用 lambda,但从来没有使用过符号。都没有达到预期的效果。 RSpec 中的 ":if" 是一种隐式过滤机制,在描述测试时运行以辨别是否运行它们。我希望有一个配置,或者我可以做些什么来在运行时获得相同的行为。
    • 听起来像是一个功能请求。在此之前,您可以随时return unless viewDifferent?
    • 抛出unexpected return
    • @MaicolBen,试试next unless viewDifferent?。使用 next 将从块中返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多