Пересмешивать объектный метод в потоке? - PullRequest
1 голос
/ 10 февраля 2010

В ситуации ниже объекта @crawl ПОЛУЧАЕТ вызов обхода, но метод имитации завершается неудачно, т. Е. Метод не проверяется.

Поток как-то создает свою собственную копию объекта @crawl, избегая макета?

  @crawl.should_receive(:crawl).with(an_instance_of(String)).twice.and_return(nil)

  threads = @crawl.create_threads

код создания темы:

  def crawl(uri)
    dosomecrawling
  end

  def create_threads
    (1..5).each do
      Thread.new do
        crawl(someurifeedingmethod)
      end
    end
  end

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Из опубликованного кода не видно, что вы присоединяетесь к темам. Если это так, то возникает условие гонки: иногда тест выполняется с некоторыми или всеми потоками, не выполнившими свою работу; Исправление по этим направлениям:

!/usr/bin/ruby1.9

class Crawler

  def crawl(uri)
    dosomecrawling
  end

  def create_threads
    @threads = (1..5).collect do
      Thread.new do
        crawl(someurifeedingmethod)
      end
    end
  end

  def join
    @threads.each do |thread|
      thread.join
    end
  end

end

describe "the above code" do

  it "should crawl five times" do
    crawler = Crawler.new
    uri = "uri"
    crawler.should_receive(:someurifeedingmethod).with(no_args).exactly(5).times.and_return(uri)
    crawler.should_receive(:crawl).with(uri).exactly(5).times
    crawler.create_threads
    crawler.join
  end

end
0 голосов
/ 03 марта 2010

Этот код отлично работает.

Вы можете добавить в 5 раз больше ожидаемых.


class Hello
  def crawl(uri)
    puts uri 
  end 

  def create_threads
    (1..5).each do
      Thread.new do
        crawl('http://hello')
      end 
    end 
  end 
end

describe 'somting' do
  it 'should mock' do
    crawl = Hello.new
    5.times do
      crawl.should_receive(:crawl).with(an_instance_of(String)).and_return(nil)
    end                                                                                                                                   
    threads = crawl.create_threads
  end 
end

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...