2012-11-25 26 views
1

我想要一個類的實例方法返回self,並且使用另一個類實例self作爲init。
不過我掙扎來看看如何succintly符合規範的:如何從should_receive塊返回接收者實例的自我

::Api.should_receive(:new).once do |arg| 
    arg.should be_an_instance_of(::Cli) 
end 

當運行這個天賦,這確保了未來方法被調用的真實,而不是API實例,如預期,那就是回報塊的值。例如:

class Cli 
    def eg 
    api = Api.new(self) 
    api.blowup # undefined method for true 
    end 
end 

我真的很喜歡塊而不調用另一個呼叫在規範返回API實例自我Api.new(...),下面的例子就這一點,我的腦海裏非rspec的讀者會奇怪,爲什麼當清晰Api.new(...)被多次調用時,spec會通過。

任何人都可以建議如何做到最好?

目前的解決方案: 這倒像是::Api.new(...)被稱爲三次:第一次創建api,曾經創造cli,曾經創造start。然而,一個電話的規格通過。我明白爲什麼這是正確的,所以不是一個錯誤。不過,我想要一個規範,一個不熟悉rspec的讀者可以掃描,並且不會產生Api.new已被多次調用的印象。還請注意...once.and_return(api){...}不起作用,該塊需要返回api才能通過。

let(:cli){ ::Cli.start(['install']) } 
let(:start){ ::Cli.start(['install']) } 
it 'is the API' do 
    api = ::Api.new(cli) 
    ::Api.should_receive(:new).once do |arg| 
    arg.should be_an_instance_of(::Cli) 
    api 
    end 
    start 
end 

回答

1

您可以在一個局部變量保存原始方法(new),然後用它來從塊返回新api

original_method = ::Api.method(:new) 
::Api.should_receive(:new).once do |arg| 
    arg.should be_an_instance_of(::Cli) 
    original_method.call(arg) 
end 

這將運行預期,檢查的參數是::Cli的一個實例,然後從原始方法(即api)返回值。

+0

謝謝@shioyama,謝謝你的建議。不幸的是,它沒有鍛鍊。我已經添加了我目前擁有的內容,但感覺非常不雅。希望這能澄清這個問題,你會看到更好的方法? – Hedgehog

+0

更新了我的答案,看看是否有效。 –

+0

我做了一些小小的調整,並通過了vladr的批准。 – Hedgehog