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