我有一个Rails引擎,旨在为我们的大型项目提供一些模型和控制器。引擎的规格相当不错,在引擎的虚拟应用程序中使用了一堆模拟和一些全尺寸模型和控制器,以确保引擎正在做它应该做的事情并使用更大的应用程序。
但是,即使所有测试都通过,我也经常在更大的应用程序中更新引擎时发现损坏的行为。如果我的测试通过但是行为被破坏了,那么测试显然有些问题,但是什么呢?我嘲笑的太多,还是不够?
为了让我更接近解决这个问题,我希望能够在整个应用程序中运行引擎的测试。这看起来应该是可能的,但我并不完全了解rspec,以了解如何处理。
(这与this question有关,但不完全相同;我不是试图从一个命令运行所有规范,只是为了在完整的应用环境中运行引擎的规范。This也似乎是相关的。实际上,我已经阅读了用rspec和rails-engines标记的每个问题 - 没有多少 - 而且它们都不是我需要的,或者没有答案。)
答案 0 :(得分:14)
最简单的解决方案是在rspec命令中指定路径。如果您有目录结构
/project
/engine
/engine_2
然后你应该运行所有规范
cd project
rspec spec/ ../engine/spec ../engine_2/spec
但是如果你想在Continous Integration上运行规范或者这似乎不太舒服我用自定义的 rake spec 任务解决了这个问题,改变了模式方法。
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
在引擎类中,添加config.rspec_paths
的路径class Engine < ::Rails::Engine
# Register path to rspec
config.rspec_paths << self.root
end
不要忘记在基础项目中的某处初始化config.rspec_paths。
如果你想添加工厂然后你可以创建初始化程序,你可以在stackoverflow上找到解决方案。
不确定这个解决方案是否最好但对我有用,我很满意。祝你好运!