這是我第一次嘗試建立與心中SRP一個應用程序,真的試圖用測試來驅動代碼的網站,而不是開始我數據架構(ActiveRecord),然後構建適合的應用程序。
但我遇到了問題。我已經訂閱並觀看了很多銷燬所有軟件的屏幕錄像,理論上我喜歡他所講的內容,但我在實踐中遇到了麻煩。手頭
問題,我知道我的應用程序的主要功能將搜索基於位置配置文件。所以我爲此寫了一個簡單的Cucumber功能(故意暫時放棄路由/控制器/等等,以簡化手頭的任務)。
search.feature:
Feature: Search for profiles
Scenario: By zipcode
When I search for 90210
Then I will see profiles near 90210
search_steps.rb:
When /^I search for 90210$/ do
@profiles = ProfileSearch.new.near_location(90210).all
end
Then /^I will see profiles near 90210$/ do
pending # express the regexp above with the code you wish you had
end
沒有問題,現在到規格:
profile_search_spec.rb:
require_relative '../../app/services/profile_search'
describe ProfileSearch do
it "finds nearby profiles"
it "does not find far away profiles"
end
profile_search .rb:
class ProfileSearch
end
我已經使用了一個ProfileSearch類的原因有幾個。
- 在ActiveRecord(單一職責原則)之外儘可能多地移動業務邏輯似乎是正確的做法。
- PORO使得測試更快(無需加載Rails)。
- 我打算在不久的將來使用ElasticSearch或Solr,並希望界面保持不變。
我不確定接下來要做什麼。 ProfileSearch
顯然取決於Profile
模型,我很確定這將是ActiveRecord。
所以問題是我開始specing和建設Profile
,並開始在我的測試中加載Rails?這似乎是最簡單的選擇,但有關它似乎是錯誤的。我覺得我會設計和構建我的應用尚未特別要求的行爲。我不得不考慮領域,關係和存儲等等,所有這些我的應用程序目前都不應該關心。
或者我應該在我的ProfileSearch
規範中使用存根/嘲all對Profile
的所有調用,並確保調用正確的方法?這也看起來是錯誤的,因爲我不會真正測試行爲,而且即使預期會出現相同的行爲,切換到Solr或ElasticSearch時也必須重寫測試。
或者我應該真正創造建立他的維基的事情時,不使用ActiveRecord暫且但正確響應所有正確的方法爲Bob大叔表現出了工作檔案模式?這似乎是理論上可能是最好的方法,但知道我將在未來使用ActiveRecord,它似乎也是相當多餘的。
或者...他媽的它扔在ActiveRecord的模型中的方方面面:\
有這麼多的模式,原則和最佳實踐漂浮在我的頭上,我不知道跆拳道做。
你會怎麼做?
完全支持的第一個點。我們稱這些測試爲「[皮下測試]」(http://martinfowler.com/bliki/SubcutaneousTest)。HTML)「,並且通常從控制器開始,並通過堆棧完全集成到真正的數據庫(通常是嵌入式版本,因此它可以在內存中運行),就像Dave說的那樣,它可以很好地重構控制器的許多部分模型和持久性問題可以重構,而且測試不需要改變,當有IO抽象時,這些問題通常會被嘲笑,因爲它們並不重要,我在構建這些方法時採取了測試優先的方法。 – 2016-12-22 14:56:11