我会保持简短,我有一个与其他应用程序通信的rails应用程序,有些使用SOAP(当然是非rails应用程序......)和其他有REST的应用程序。我正在进行集成测试,以确保我的端点包装器类具有正确的映射和设置。但是,它们默认由rake test
执行,这使得它变得缓慢而脆弱。我希望经常进行单元测试,并且只能按需“进行集成测试”。你是怎么做到的?
您对此类集成测试的偏好是什么?
更新问:如何在运行rake test
时排除测试目录?
答案 0 :(得分:5)
如果按照Rspec / Cucumber人员的建议,那么集成测试级别是模拟数据的不适当的地方,因为在某些方面,它会破坏集成/验收测试的目的。但是,你有模拟像paypal交易这样的东西,对吗?在我目前的项目中,我面临很多这样的问题,以下是我正在实施的一些解决方案:
模拟服务请求。是的,这可能是一个坏主意,但我不知道如何做到这一点,否则任何可预测性。我有一个单独的测试套件来确认服务正在运行,并且从我的rails应用程序,我假设它们正常工作。这方面的一个例子是LDAP。是的,在这种情况下,我倾向于使用真正的反应并做类似的事情。 response = double('response') ; response.expects(:data).and_returns('my xml here')
我确实认为无论系统的复杂性如何,终点测试都非常重要。我真的很喜欢黄瓜,它提供了我在功能测试中需要做的95%,所以我最终编写了更少的这些测试和更多的整个工作流程测试。
答案 1 :(得分:1)
解决方案是VCR。
答案 2 :(得分:0)
从rake test
中排除端点集成测试,并且能够使用rake test:endpoints
隔离并运行它们,只需几行代码即可解决。我不得不承认,我花了很多时间发誓和咒骂。铁路来源应该有更多的文件和解释。像这样的Ruby代码往往不是很容易解释,IMO。
嗯,这就是: 创建你的任务:lib / tasks / slow_tests.rake
require 'rails/test_unit/railtie'
desc "Runs all endpoint integration tests."
namespace :test do
#hooks on to the test task through the 'test:prepare'
#For details, check the railties gem (v3.0+) lib/rails/test_unit/testing.rake,
#look for "task :test" and "namespace :test"
TestTaskWithoutDescription.new(:endpoints => 'test:prepare') do |t|
t.libs << 'test'
t.pattern = 'test/endpoints/**/*_test.rb'
end
end
现在我可以将我脆弱的端点集成测试放在test / enpoints目录中,随时运行它们(不经常)
注意:这假设是test / unit或shoulda。
答案 3 :(得分:0)
您应该在外部API(Facade / Wrapper)周围编写一个薄层,并使用vcr-gem到“存根”网络调用。 您可以从rails test architecture上的文章中获取更多信息。