2014-02-04 2 views
1

Итак, у меня есть два вызова метода retry_with_timeout, который принимает блок и выполняется до тех пор, пока блок не вернет true или значение, отличное от nil (т.е. false приведет к циклу), или пока Тайм-аут происходитRspec mocking block on the stub не получается

Sample класс:

def do_the_thing 
    retry_with_timeout(10, 5) do 
    case something 
     when 1 
     false 
     when 2 
     false 
     else 
     raise 
    end 
    end 

    retry_with_timeout(30, 10) do 
    case something_else 
     when 1 
     false 
     when 2 
     false 
     when 3 
     true 
     else 
     raise 
    end 
    end 
end 

Spec класс:

it "should pass when the thing is 3" do 
    model = test_model #creates a double and stubs all of the necessary common methods 

    t_model.stub(:retry_with_timeout).with(10, 5).ordered 
    t_model.stub(:retry_with_timeout).with(30, 10).and_yield().ordered 

    expect { t_model.do_the_thing }.to be(true) 
end 

Я получаю сообщение об ошибке, потому что '3' дело не в первом блоке, таким образом, 'еще' является вызов ed ...

Мне нужно пропустить первый и оценить во втором блоке .... Я пробовал ВСЕ, И Я ЛЮБЛЮ МОЙ МИР !!!! Может кто-нибудь мне помочь?

ответ

0

Итак, я ответил мой собственный вопрос ... Оказывается, есть некоторые особенности, которые не задокументированы ... Для того, чтобы вернуть то выход, нужно сделать это следующим образом:

t_model.stub(:some_method).and_return("Cool", "Awesome", and_yield(foo)) 

#Just for informations' sake 
t_model.stub(:some_other_method).and_return("FOO", "BAR", raise_error) 

его добавленный как возвращенный товар по какой-либо причине и НЕ ДОКУМЕНТАЦИЯ В ЛЮБОЕ ВРЕМЯ !!!!!