pjm*_*rse 9 gem rspec ruby-on-rails rails-engines ruby-on-rails-3.2
我有一个Rails引擎,旨在为我们的大型项目提供一些模型和控制器.引擎的规格相当不错,在引擎的虚拟应用程序中使用了一堆模拟和一些全尺寸模型和控制器,以确保引擎正在做它应该做的事情并使用更大的应用程序.
但是,即使所有测试都通过,我也经常在更大的应用程序中更新引擎时发现损坏的行为.如果我的测试通过但是行为被破坏了,那么测试显然有些问题,但是什么呢?我嘲笑太多,还是不够?
为了让我更接近解决这个问题,我希望能够在整个应用程序中运行引擎的测试.这似乎应该是可能的,但我不完全了解rspec如何处理.
(这与这个问题有关但不完全相同;我不是试图从一个命令运行所有规范,只是为了在完整的应用程序环境中运行引擎的规范.这似乎也是相关的.实际上,我'我读过用rspec和rails-engines标记的每个问题- 这些问题并不多 - 而且它们都不是我需要的,或者没有答案.)
Kam*_*pek 14
最简单的解决方案是在rspec命令中指定路径.如果你有目录结构
/project
/engine
/engine_2
Run Code Online (Sandbox Code Playgroud)
那么你应该运行所有的规格
cd project
rspec spec/ ../engine/spec ../engine_2/spec
Run Code Online (Sandbox Code Playgroud)
但是如果你想在Continous Integration上运行规范或者这似乎不太舒服我用自定义的rake规范任务解决了这个问题,改变了模式方法.
lib/task/rspec.rake应该是这样的
require "rspec/core/rake_task"
RSpec::Core::RakeTask.new(:spec)
task :default => :spec
RSpec::Core::RakeTask.module_eval do
def pattern
extras = []
Rails.application.config.rspec_paths.each do |dir|
if File.directory?( dir )
extras << File.join( dir, 'spec', '**', '*_spec.rb' ).to_s
end
end
[@pattern] | extras
end
end
Run Code Online (Sandbox Code Playgroud)
在引擎类中,添加config.rspec_paths的路径
class Engine < ::Rails::Engine
# Register path to rspec
config.rspec_paths << self.root
end
Run Code Online (Sandbox Code Playgroud)
并且不要忘记在基础项目中的某处初始化config.rspec_paths.
如果你想添加工厂然后你可以创建初始化程序,你可以在stackoverflow上找到解决方案.
不确定这个解决方案是否最好,但对我有用,我很满意.祝好运!