Rspec 和 Draper:class 名称上的未初始化常量

Rspec and Draper : unitialized constant on class name

在 Rails 4 上,当我对装饰器执行 rspec 测试时,出现以下错误:

/app/spec/decorators/my_decorator_spec.rb:3:in `<top (required)>': uninitialized constant MyDecorator (NameError)

我肯定漏掉了什么,但我不知道是什么。

我生成装饰器

rails g decorator My

生成spec/my_decorator_spec.rb文件,内容为:

require 'spec_helper'

describe MyDecorator do
end

那我测试一下

rspec spec/decorators/my_decorator_spec.rb

我没有在 application.rb 或 spec_helper.rb 中添加任何内容。 装饰器本身工作正常。

编辑

这比我想象的还要奇怪。当我测试所有 rspec 文件时,装饰器规范文件中的测试被正确执行。

有效:

rspec spec/

不是:

rspec spec/decorators
rspec spec/decorators/my_decorator_spec.rb

这是因为装饰器规范是在文件顶部使用 require 'spec_helper' 而不是 require 'rails_helper' 生成的。当您 运行 其他规格 装饰器规格之前(例如,控制器规格,当 运行 宁 rspec spec/ 时,因为 c 在 d 之前),然后他们最终会在您的装饰器规格达到 运行 之前要求正确的文件,所以一切都很好。

解决方案是在装饰器规范中将 spec_helper 要求替换为 rails_helper:

perl -pi -e 's/spec_helper/rails_helper/' spec/decorators/*

一旦你这样做,你应该没有问题 运行宁 rspec spec/decorators

N.B.: This change已经在draper repo中制作了,但是是在gem的2.1.0版本发布之后制作的,是最新的非gem 预发布。