2017-05-16 52 views
0

我在我的控制器中有一個稱爲clone的規範,其中我接收用戶並克隆重複的用戶。如何在控制器中測試特定方法

我需要做的就是我的控制器內(我的模型是player等控制器player_controller.rb,我需要測試下面列出的具體方法。

def clone 
    new_player = @player.dup 
    new_player.id = nil 
    new_player.serial = nil 
    new_player.name = "Copy of #{@player[:name]}" 
end 

describe '#clone' do 
    it 'creates a clone of an existing player' do 
    new_player = player.dup 
    end 
end 

知道我在我的規格做的是鏡像控制器中方法的第一行,因此它爲我創建了一個新的播放器,但它不更新規範的附加功能,如名稱。這就是我遇到的問題。在我的控制器內專門調出一個方法?

我試過了

new_player = player.controller.send(:clone) 

以及

new_player = player.(:clone) 

的第一個錯誤不承認clone而且我收到了玩家一個未定義的方法「呼」的第二個錯誤狀態。 (我不太明白那個錯誤)

有人會知道如何把那個人拉出來讓我測試它嗎?

非常感謝。

+0

該方法不屬於控制器。控制器是協調器。他們協調多個移動部分,但他們自己幾乎不做任何工作(「胖胖的模特,瘦削的控制者」學派)。如果你遵循這一點,你的控制器中就不會有任何值得測試的代碼,並且不會被rails或其他gem測試過。所以是的,將克隆邏輯提取到一個ServiceObject(或其他東西)中,這將是微不足道的測試。 –

回答

1

最後你的控制器不過是一個Ruby類。創建它的一個實例併爲剛剛創建的對象調用方法clone。

PlayerController.new.clone 

PlayerController.new.send(:clone) 

我在這裏看到的是問題,從哪裏是@player得到初始化?這個類沒有構造函數(因爲它是一個控制器)。如果還有其他方法說'my_test_method',則將其初始化。然後在PlayerController對象上首先調用該方法,然後在同一個對象上調用clone方法。

my_object = PlayerController.new 
my_object.my_test_method 
my_object.clone 

如果從設置@player的操作中調用克隆方法。然後將此方法的規範作爲您爲此操作編寫的規範的一部分。

相關問題