使用RSpec 3.2和Rails 4.2的新项目。
作为一个好公民,我正在尝试用新的RSpec做“正确”的事情(禁用猴子修补,不要推断示例的类型等)。
我遇到的问题是我想测试这个小班:
# app/models/session.rb
class Session # NOTE: This is a simple transient class, almost plain Ruby class
include ActiveModel::Model
attr_accessor :email, :password
end
有类似的东西:
# spec/models/session_spec.rb
require 'spec_helper'
RSpec.describe Session, type: :model do
it { should validate_presence_of :email }
it { should validate_presence_of :password }
end
显然,当我运行规范时,我得到的uninitialized constant Session (NameError)
是有意义的,因为'spec_helper'没有做任何事情来加载那个特定的类。
我可以让用户使用rails_helper
,但这对于那个小类来说太过分了,因为它与rails完全无关。
愿意做“正确”我对以下问题感到困惑
Session
规范是否需要标有type: :model
?spec_helper
以更改$LOAD_PATH
吗?session.rb
文件,但没有加载整个Rails?Session
课程应该在app/models
之下吗?我认为它是一个模型,它只是不持久。最简单的方法当然是使用rails_helper
,但对于我需要做的事情,这是不必要的,我希望能够快速保存规范文件。
答案 0 :(得分:0)
区分spec_helper
和spec_helper
的关键在于您只想使用$LOAD_PATH
进行最小化设置,因此我建议不要在那里修改spec_helper
。您获得的唯一优势是,如果您运行仅使用 rspec spec/models/session_spec.rb
的 规范,则规范运行得更快,例如当您使用{仅运行单个spec文件时{1}}。如果你在任何规范中运行整个套件并需要rails_helper
,那么它通常不会运行得更快。
基本上,您有两种选择:
如果您不担心运行速度稍慢的单个规格文件,并且您不想手动要求Session
模型,我会说& #39;为了简单起见,使用rails_helper
完全没问题。
如果您实际上 关心运行速度更快的单个spec文件,可以在spec文件的顶部手动require_relative '../app/models/session'
。自动加载是Rails的魔力,你不会因为速度原因而想要Rails;因此,您需要手动完成。
您不需要将规范标记为type: :model
,除非您有仅包含在type: :model
中的特定规范帮助程序,并且您打算使用它们。但是,当您将其视为常规模型并使用rails_helper
时,以这种方式标记它们是有意义的。