Проверьте, вызвана ли функция в Ruby on Rails unit test

Я использую TestUnit и хотел бы определить, вызвана ли функция. У меня есть метод в классе Person, который я называю "before_update":

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

Тогда у меня есть unit test:

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

Как я могу гарантировать, что был вызван метод "geocode"? Это более важно для случая, когда я хочу убедиться, что он не вызывается, если информация о местоположении не изменилась.

Спасибо!

2 ответа

Используйте мокко. Это проверяет логику вашего фильтра:

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


Вам нужны макетные объекты (см. Mockobjects и Mocks - это не окурки для более общей информации). RSpec поддерживает поддержку для них, и есть другие автономные библиотеки (например, Mocha), который должен помочь вам, если вам не нужно переключиться на RSpec.

licensed under cc by-sa 3.0 with attribution.