Тестирование драгоценных камней в приложении Rails - PullRequest
0 голосов
/ 23 февраля 2011

Я пытаюсь проверить, правильно ли мой сервис вызывает Anemone.crawl.У меня есть следующий код:

spider_service.rb

class SpiderService < BaseService
  require 'anemone'
  attr_accessor :url
  def initialize(url)
    self.url = url
  end
  def crawl_site
    Anemone.crawl(url) do |anemone|
    end
  end
end

spider_service_spec.rb

require 'spec_helper'
require 'anemone'

describe SpiderService do
  describe "initialize" do
    let(:url) { mock("url") }

    subject { SpiderService.new(url) }

    it "should store the url in an instance variable" do
      subject.url.should == url
    end
  end

  describe "#crawl_site" do
    let(:spider_service) { mock("spider service") }
    let(:url) { mock("url") }

    before do
      SpiderService.stub(:new).and_return(spider_service)
      spider_service.stub(:crawl_site)
      Anemone.stub(:crawl).with(url)
    end

    subject { spider_service.crawl_site }

    it "should call Anemone.crawl with the url" do
      Anemone.should_receive(:crawl).with(url)
      subject
    end

  end
end

И вотошибка, которую я получаю и не могу понять, так как я могу вызвать службу в консоли Rails и получить данные от Anemone, когда я предоставляю действительный URL:

Failures:

  1) SpiderService#crawl_site should call Anemone.crawl with the url
     Failure/Error: Anemone.should_receive(:crawl).with(url)
     (Anemone).crawl(#<RSpec::Mocks::Mock:0x82bdd454 @name="url">)
         expected: 1 time
         received: 0 times
     # ./spec/services/spider_service_spec.rb:28

Пожалуйста, сообщите мнеЯ забыл что-то глупое (я могу винить в этом отсутствие кофе, а не общую некомпетентность!)

Спасибо за потраченное время,

Гав

1 Ответ

1 голос
/ 23 февраля 2011

Ваш субъект вызывает метод для созданного имитируемого объекта (mock ("spider_service")), а не реального объекта SpiderService.Вы также оформили вызов службы фиктивных пауков, чтобы ничего не делать, поэтому вызов этого в теме ничего не даст, поэтому ваш тест не пройден.

Кроме того, вы озвучили новый (хотя вы никогда не звонитеэто) на SpiderService, чтобы вернуть фиктивный объект.Когда вы тестируете SpiderService, вы захотите иметь реальные экземпляры класса, иначе вызовы методов не будут вести себя так же, как в реальном экземпляре класса.

Следующее должно достичь того, что вы хотите:

describe "#crawl_site" do
  let(:spider_service) { SpiderService.new(url) }
  let(:url) { mock("url") }

  before do
    Anemone.stub(:crawl).with(url)
  end

  subject { spider_service.crawl_site }

  it "should call Anemone.crawl with the url" do
    Anemone.should_receive(:crawl).with(url)
    subject
  end

end

Возможно, вы захотите переместить обязательный 'anenome' за пределы определения класса, чтобы он был доступен в другом месте.

...