2011-05-13 42 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