这是我第一次尝试建立与心中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