前言
这是我第一次尝试在考虑 SRP 的情况下构建应用程序,并真正尝试使用测试来驱动网站的代码,而不是从我的数据架构 (ActiveRecord) 开始,然后构建适合的应用程序。
但我遇到了问题。我订阅并观看了很多 Destroy All Software 的截屏视频,理论上我喜欢他所宣扬的内容,但我在实践中遇到了麻烦。
手头的问题
我知道我的应用程序的主要功能是根据位置搜索个人资料。因此,我为此编写了一个简单的 Cucumber 功能(暂时不使用路由/控制器/等,以简化手头的任务)。
搜索功能:
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。
所以问题是我是否开始规范和构建Profile
并开始在我的测试中加载 Rails?这似乎是最简单的选择,但似乎有些错误。我觉得我会设计和构建我的应用程序尚未特别要求的行为。我将不得不考虑字段、关系和存储等,所有这些都是我的应用程序目前不应该关心的。
Profile
或者我应该对规范中的所有调用使用存根/模拟,ProfileSearch
并确保调用了正确的方法?这似乎也是错误的,因为那时我不会真正测试该行为,并且在切换到 Solr 或 ElasticSearch 时我必须重写测试,即使预期会有相同的行为。
或者我实际上应该创建一个工作的 Profile 模型,它暂时不使用 ActiveRecord,但可以正确响应 Bob 叔叔在构建他的 wiki 事物时展示的所有正确方法?从理论上讲,这似乎是最好的方法,但知道我将来会使用 ActiveRecord,这似乎也很多余。
或者...去他妈的,把所有东西都扔到 ActiveRecord 模型中:\
有太多的模式、原则和最佳实践在我脑海中浮现,我不知道 WTF 该怎么做。
你会怎么做?