Pytanko o rspeca

Mam model SearchTerm.

class SearchTerm < ActiveRecord::Base
  belongs_to :location
  validates :keyword, presence: true

  def self.hit(keyword)
    search_term = find_by(keyword: keyword) || new(keyword: keyword)
    if search_term.new_record?
      location_hash = Location.parse_address(keyword)
      location = Location.find_or_create_by(location_hash)
      search_term.location = location
    end

    search_term.hits += 1
    search_term.save
    search_term
  end
end

Chcę napisac jeden test tej metody .hit, w którym sprawdzałbym czy Location.parse_address było odpalone czy nie, czyli coś w stylu:

  it "opis ..." do
    SearchTerm.hit("Poland")

    expect(Location).to receive(:parse_address)
  end

i drugi test jak nie ma w bazie wyszukiwan “Poland” zeby bylo .to_not receive(:parse_address)
Ten expect mi nie działa, ale coś czuję, że jakoś inaczej powinienem go skonstruować, bo skąd niby ma wiedzieć ,że chodzi o tą metodę. Jak to zrobić?

I drugie pytanie (chyba o stuby, double - srednio to ogarniam), ale Location.parse_address wysyla zapytanie do google maps, a przy testach chcialbym to ominac i na sztywno ustalic, ze np. dla Location.parse_address(“Poland”) zwrocilo {city: nil. state: nil, country: “Poland”} - gdzie i jak to ustawic?

Dobra, chyba odkryłem :smile:

Wystarczy zmienić kolejnośc, czyli najpierw ustawiam, że oczekuję, że:
expect(Location).to receive(:parse_address)
A potem dopiero odpalam, to co chcę, przetestować czyli:
SearchTerm.hit("Poland")

W takim razie prośba o podpowiedź co do drugiego pytania.

expect(Location).to receive(:parse_address).and_return({city: nil. state: nil, country: “Poland”})