Rspec 和 Draper :类名的统一常量

vin*_*ntp 2 rspec ruby-on-rails draper

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

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

我肯定错过了一些东西,但我不知道是什么。

我生成装饰器

rails g decorator My
Run Code Online (Sandbox Code Playgroud)

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

require 'spec_helper'

describe MyDecorator do
end
Run Code Online (Sandbox Code Playgroud)

然后我测试

rspec spec/decorators/my_decorator_spec.rb
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

有用 :

rspec spec/
Run Code Online (Sandbox Code Playgroud)

它没有:

rspec spec/decorators
rspec spec/decorators/my_decorator_spec.rb
Run Code Online (Sandbox Code Playgroud)

Ben*_*tis 5

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

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

perl -pi -e 's/spec_helper/rails_helper/' spec/decorators/*
Run Code Online (Sandbox Code Playgroud)

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

注意:此更改已在 draper 存储库中进行,但它是在 gem 版本 2.1.0 发布后进行的,这是 gem 的最新非预版本。