2009-11-04 135 views
5

我正在使用TestUnit並想確定函數是否被調用。我有一類叫做Person的方法,我設置爲被稱爲「before_update」:測試一個函數是否在Ruby on Rails單元測試中被調用

def geocode_if_location_info_changed 
    if location_info_changed? 
     spawn do 
     res = geocode 
     end 
    end 
    end 

然後,我有一個單元測試:

def test_geocode_if_location_info_changed 
    p = create_test_person 
    p.address = "11974 Thurloe Drive" 
    p.city = "Baltimore" 
    p.region = Region.find_by_name("Maryland") 
    p.zip_code = "21093" 
    lat1 = p.lat 
    lng1 = p.lng 

    # this should invoke the active record hook 
    # after_update :geocode_if_location_info_changed 
    p.save 
    lat2 = p.lat 
    lng2 = p.lng 
    assert_not_nil lat2 
    assert_not_nil lng2 
    assert lat1 != lat2 
    assert lng1 != lng2 

    p.address = "4533 Falls Road" 
    p.city = "Baltimore" 
    p.region = Region.find_by_name("Maryland") 
    p.zip_code = "21209" 

    # this should invoke the active record hook 
    # after_update :geocode_if_location_info_changed 
    p.save 

    lat3 = p.lat 
    lng3 = p.lng 
    assert_not_nil lat3 
    assert_not_nil lng3 
    assert lat2 != lat3 
    assert lng2 != lng3 
end 

我如何能確保「地址解析」的方法被稱爲?如果位置信息沒有改變,我想確保它不被調用,這對於更重要的情況。

謝謝!

回答

6

使用摩卡。這測試您的過濾器的邏輯:

def test_spawn_if_loc_changed 
    // set up omitted 
    p.save! 
    p.loc = new_value 
    p.expects(:spawn).times(1) 
    p.save! 
end 

def test_no_spawn_if_no_data_changed 
    // set up omitted 
    p.save! 
    p.other_attribute = new_value 
    p.expects(:spawn).times(0) 
    p.save! 
end 
+0

我同意這個答案,但我想你想'p.expects(:geocode_if_location_info_changed).times(1)'。我可以在這裏使用摩卡。在我看來,過濾器之前似乎與合作者非常接近。 – 2009-11-05 15:03:44

+0

我試圖測試之前的過濾器的邏輯,* spawn *是if中的第一個東西。如果你只是測試before過濾器的調用,那麼你只是測試了「before_filter」是否存在,並且rails正在工作......這很好,但是好像我們試圖去了解過濾器中的邏輯。 – ndp 2009-11-05 15:40:36

+0

好點 - 我可以看到那個角度。 – 2009-11-05 19:00:46

1

您需要的是模擬對象(有關更多一般信息,請參閱MockobjectsMocks aren't stubs)。 RSpec有support for them,並且還有其他獨立庫(例如,Mocha),如果您不需要切換到RSpec,它應該會對您有所幫助。

+0

我應該在這裏嘲笑?我的人物是被測系統,根據Martin Fowler的文章,mocks應該用於合作者。 – Tony 2009-11-04 22:56:02

相關問題