我正在使用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
我如何能確保「地址解析」的方法被稱爲?如果位置信息沒有改變,我想確保它不被調用,這對於更重要的情況。
謝謝!
我同意這個答案,但我想你想'p.expects(:geocode_if_location_info_changed).times(1)'。我可以在這裏使用摩卡。在我看來,過濾器之前似乎與合作者非常接近。 – 2009-11-05 15:03:44
我試圖測試之前的過濾器的邏輯,* spawn *是if中的第一個東西。如果你只是測試before過濾器的調用,那麼你只是測試了「before_filter」是否存在,並且rails正在工作......這很好,但是好像我們試圖去了解過濾器中的邏輯。 – ndp 2009-11-05 15:40:36
好點 - 我可以看到那個角度。 – 2009-11-05 19:00:46