9

我有一个 Rails 引擎,旨在为我们更大的项目提供一些模型和控制器。引擎有一套相当不错的规格,在引擎的虚拟应用程序中使用一堆模拟和一些全尺寸模型和控制器,以确保引擎正在做它应该做的事情并与更大的应用程序一起工作。

然而,即使所有测试都通过了,当我在更大的应用程序中更新引擎时,我经常会发现有问题的行为。如果我的测试通过但行为被破坏,那么测试显然有问题,但是什么?我是在嘲讽太多,还是不够?

为了让我更接近于弄清楚这一点,我希望能够从完整的应用程序内部运行引擎的测试。这似乎应该是可能的,但我对 rspec 的理解不够透彻,无法掌握如何处理。

(这与这个问题有关,但不完全相同;我不是试图从一个命令运行所有规范,只是为了在完整的应用程序环境中运行引擎的规范。似乎也相关。实际上,我我已经阅读了所有用标记的问题——数量不多——它们要么不是我需要的,要么没有答案。)

4

1 回答 1

14

最简单的解决方案是在 rspec 命令中指定路径。如果你有目录结构

/project
/engine
/engine_2

然后你做并且应该运行所有的规范

cd project
rspec spec/ ../engine/spec ../engine_2/spec

但是,如果您想在持续集成上运行规范,或者这似乎不太舒服,我通过自定义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 的某个地方找到解决方案。

不确定这个解决方案是否是最好的,但对我有用,我对此很满意。祝你好运!

于 2012-09-21T16:03:30.780 回答