RSpec: Как вы неявно фильтруете тесты на основе результатов предыдущего теста? - PullRequest
0 голосов
/ 14 мая 2011

Я перебираю древовидный элемент управления на веб-странице.Нажатие на некоторые узлы в дереве изменит содержимое в 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 ]

1 голос
/ 14 мая 2011

Тест всегда должен выполняться. Он должен установить состояние, необходимое для выполнения ожидаемого пути кода. Мне кажется, что выполнение тестов, условно основанных на результатах других тестов, полностью подрывает дух тестов.

Вы уже должны знать, что предыдущее представление и текущее представление отличаются, и если вы не ожидаете, у вас возникла ошибка.

Каждый тест должен иметь очень специфический путь через ваш код, который вы ожидаете выполнить, и вы должны потерпеть неудачу, если этого не произойдет. Нет способа сделать то, что вы хотите, потому что вы не должны делать это таким образом.

0 голосов
/ 14 мая 2011

Я не знаком с wspec, но вы пробовали использовать 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, чтобы он вызывался при выполнении теста run .

...