2012-03-28 49 views
13

我有一個Rails控制器操作來測試。在那個動作中,一個User.can方法?用不同的參數調用幾次。在其中的一個測試案例中,我想確保User.can?('withdraw')被調用。但我不關心User.can的調用?與其他參數。摩卡:如何在有多個不同參數的調用時添加方法的期望

def action_to_be_tested 
    ... 
    @user.can?('withdraw') 
    ... 
    @user.can?('deposit') 
    ... 
end 

我在測試以下嘗試:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true) 

但測試失敗,消息,指示User.can的意外調用( '存款')? 如果我通過參數'deposit'添加另一個期望值,則測試通過。但是我想知道是否有任何方法可以集中在'withdraw'參數的調用上(因爲其他調用與這個測試用例無關)。

回答

15

我只是找到了一個解決辦法,通過與不相關的參數刪空調用:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true) 
User.any_instance.stubs(:can?).with(Not(equals('withdraw'))) 

http://mocha.rubyforge.org/classes/Mocha/ParameterMatchers.html#M000023

+0

我意識到[API](http://gofreerange.com/mocha/docs/Mocha/Expectation.html#with-instance_method)支持文字值(直接比較變量)或屈服於塊,但我不確定'Not(...)'結構來自何處。你能詳細談談嗎? – Pysis 2016-12-02 14:45:21

+0

@Pysis'Not()'來自與[with()'一起使用的[Mocha :: ParameterMatchers](http://gofreerange.com/mocha/docs/Mocha/ParameterMatchers.html)。它們可以是像HasKey()這樣的駱駝案例,也可以是像has_key()這樣的蛇例。不''必須是駱駝案件,因爲它是一個關鍵字,但。 – 2017-10-06 21:02:48

12

你可以傳遞一個塊with,並且具有塊檢查的參數。利用這一點,你可以構造預期調用列表:

invocations = ['withdraw', 'deposit'] 
User.any_instance.expects(:can?).at_most(2).with do |permission| 
    permission == invocations.shift 
end 

每次can?被調用時,摩卡會屈服於塊。該塊將從預期調用列表中提取下一個值,並根據實際調用進行檢查。

相關問題