我可以从一个安装了Rails引擎的真实应用中运行该引擎的规格吗?[英] Can I run a Rails engine's specs from a real app which mounts it?

本文是小编为大家收集整理的关于我可以从一个安装了Rails引擎的真实应用中运行该引擎的规格吗?的处理方法,想解了我可以从一个安装了Rails引擎的真实应用中运行该引擎的规格吗?的问题怎么解决?我可以从一个安装了Rails引擎的真实应用中运行该引擎的规格吗?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

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

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

(这与 this question 有关,但不完全相同;我并没有尝试运行所有规范从一个命令,只是为了在完整的应用程序环境中运行引擎的规范.似乎也相关.实际上,我'已经阅读了标记为 --there are'很多——而且它们要么不是我需要的,要么没有答案.)

推荐答案

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

/project
/engine
/engine_2

然后你应该运行所有规范

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

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

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

本文地址:https://www.itbaoku.cn/post/786493.html