使用spec_helper正确使用ActiveModel

时间:2015-06-06 10:10:21

标签: ruby-on-rails ruby unit-testing rspec

使用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完全无关。

愿意做“正确”我对以下问题感到困惑

  1. Session规范是否需要标有type: :model
  2. 我应该修改spec_helper以更改$LOAD_PATH吗?
  3. 如果没有,有没有办法自动加载session.rb文件,但没有加载整个Rails?
  4. 瞬态Session课程应该在app/models之下吗?我认为它是一个模型,它只是不持久。
  5. 最简单的方法当然是使用rails_helper,但对于我需要做的事情,这是不必要的,我希望能够快速保存规范文件。

1 个答案:

答案 0 :(得分:0)

区分spec_helperspec_helper的关键在于您只想使用$LOAD_PATH进行最小化设置,因此我建议不要在那里修改spec_helper。您获得的唯一优势是,如果您运行仅使用 rspec spec/models/session_spec.rb 规范,则规范运行得更快,例如当您使用{仅运行单个spec文件时{1}}。如果你在任何规范中运行整个套件并需要rails_helper,那么它通常不会运行得更快。

基本上,您有两种选择:

  1. 如果您不担心运行速度稍慢的单个规格文件,并且您不想手动要求Session模型,我会说& #39;为了简单起见,使用rails_helper完全没问题。

  2. 如果您实际上 关心运行速度更快的单个spec文件,可以在spec文件的顶部手动require_relative '../app/models/session'。自动加载是Rails的魔力,你不会因为速度原因而想要Rails;因此,您需要手动完成。

  3. 您不需要将规范标记为type: :model,除非您有仅包含在type: :model中的特定规范帮助程序,并且您打算使用它们。但是,当您将其视为常规模型并使用rails_helper时,以这种方式标记它们是有意义的。