2017-01-31 4 views
2

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

У меня есть следующий метод экземпляра на адресной модели

validate :address, on: [:create, :update] 

def address 
    check = CalendarEventLocationParsingWorker.new.perform("", self.structured, true) 
    if check[:code] != 0 
     errors.add(:base,"#{self.kind.capitalize} Address couldn't be analysed, please fill up as much fields as possible.") 
    else 
     self.lat = check[:coords]["lat"] 
     self.lon = check[:coords]["lng"] 
    end 
    end 

В основном его метод, называемый на создание и обновление крючков и проверку с API третьей стороны, если адрес является действительным. Как я могу проверить это отдельно, не делая фактического вызова сторонней api, а скорее симулируя ответ?

Я читал о насмешках и заглушках, но я их еще не совсем понял. Любое понимание приветствуется. С помощью Rspec, помощников доски и фабричной девочки.

ответ

1

Использование webmock или vcr драгоценных камней незавершенная внешних ответов API

Пример с webmock:

stub_request(:get, "your external api url") 
    .to_return(code: 0, coords: { lat: 1, lng: 2 }) 

# test your address method here 

С vcr вы можете запустить тест один раз, и он будет делать фактический вызов внешнего API, запись его ответ на файл .yml и повторное его использование во всех последующих тестах. При изменении внешнего ответа api вы можете просто удалить файл .yml и записать новый ответ образца.

+0

Эй спасибо за это , я могу обойтись без фактического запроса хотя и не один раз? –

+0

@PetrosKyriakou Да, используйте webmock для этого –

0

Вы можете окурок perform метод на любом экземпляре CalendarEventLocationParsingWorker вернуть нужное значение

Синтаксис:

allow_any_instance_of(Class).to receive(:method).and_return(:return_value) 

Ex:

allow_any_instance_of(CalendarEventLocationParsingWorker).to receive(:perform).and_return({code: 0}) 

См: Allow a message on any instance of a class

Смежные вопросы