2016-01-22 39 views
0

我想重構一個測試套件,這種套件的方式與實現緊密耦合,但我遇到了關係問題。例如,我有一個簡單的用戶模式:測試模型的關係,而不與實現耦合

class AdminUser < ActiveRecord::Base 
    belongs_to :user_role 
    delegate :executive?, to: :user_role 
end 

這是UserRole的模型:

class UserRole < ActiveRecord::Base 
    def executive? 
    name == 'Executive' 
    end 
end 

測試的UserRole的模式很容易,但是,下面的徹底檢驗規則,我想我也應該測試AdminUser模型,因爲我期望它響應.executive ?,這就是我的問題開始的地方。

如果我遵循通常的單元測試規則,我應該只測試AdminUser,所以我可以模擬UserRole.executive?並完成它,但是...如果UserRole的實現隨着時間的推移而發生變化會怎樣?如果我想將UserRole更改爲另一個模型或更復雜的對象以遵循更復雜的規則,該怎麼辦?我需要更改AdminUser的測試以遵循新的實現,並且感覺有點骯髒,因爲在單元測試中肛門,我應該只測試'what',而不是'how'。

我在這裏過於嚴格嗎?有沒有更好的方式來做到這一點,我不抓?

回答

1

如果您對AdminUser的實現一無所知,該怎麼辦?你如何知道它是否響應#executive??很簡單:

expect(admin_user.respond_to?(:executive?)).to be_true 

編寫另一個測試中UserRole#executive?,就大功告成了。

如果您將#executive?移出UserRole或更改其行爲,當然您需要更新測試。但AdminUser的行爲不會改變....或者說,它對於這個方法的行爲完全由另一個類決定。在多個地方測試該方法無濟於事。