【问题标题】:rSpec Testing Rails using Shoulda matchersrSpec 使用 Shoulda 匹配器测试 Rails
【发布时间】:2013-08-10 17:17:09
【问题描述】:

我已经开始学习在我的 Rails 应用程序中进行测试,并且正在使用 rSpec 和 Shoulda。

我有以下有效的测试:

it { should respond_to(:park_name) }

但是,我不明白的是,这是在运行什么?这是在模型本身还是模型的实例上运行,如果它是模型的实例,那么它会自动使用我的 Factory Girl 工厂吗?

对这里实际发生的事情有任何简单的解释吗?

更新:

好的,我有这个:

  describe 'validations' do

    subject { FactoryGirl.build(:coaster) }

    it { should validate_presence_of(:name) }
    it { should validate_presence_of(:speed) }
    it { should validate_presence_of(:height) }

  end

但是测试失败了。有什么想法吗?

Coaster.rb:

class Coaster < ActiveRecord::Base

      extend FriendlyId
      friendly_id :slug, use: :slugged

      belongs_to :park
      belongs_to :manufacturer

      attr_accessible :name,
                      :height,
                      :speed,
                      :length,
                      :inversions,
                      :material,
                      :lat,
                      :lng,
                      :park_id,
                      :notes,
                      :manufacturer_id,
                      :style,
                      :covering,
                      :ride_style,
                      :model,
                      :layout,
                      :dates_ridden,
                      :times_ridden,
                      :order,
                      :on_ride_photo



      scope :by_name_asc, lambda {
        order("name ASC")
      }

      scope :made_from, lambda { |material|
        where("material = ?", material)
      }

      scope :wooden, lambda {
        made_from "wood"
      }

      scope :steel, lambda {
        made_from "steel"
      }



      delegate :name, :location_1, :location_2, :location_3, :location_4,
        to: :park,
        allow_nil: true,
        prefix: true

      delegate :name, :url,
        to: :manufacturer,
        prefix: true



      validates :name,
        :presence => true

      validates :height,
        allow_nil: true,
        numericality: {greater_than: 0}

      validates :speed,
        allow_nil: true,
        numericality: {greater_than: 0}

      validates :length,
        allow_nil: true,
        numericality: {greater_than: 0}

测试结果:

1) 过山车验证需要设置速度 失败/错误:它 { 应该 validate_presence_of(:speed) } 当速度设置为零时,预期的错误包括“不能为空白”,没有错误 # ./spec/models/coaster_spec.rb:75:in `block (3 levels) in '

2) 过山车验证应要求设置高度 失败/错误:它 { 应该 validate_presence_of(:height) } 当高度设置为零时,预期的错误包括“不能为空白”,没有错误 # ./spec/models/coaster_spec.rb:76:in `block (3 levels) in '

类似问题:

我有这个测试:

describe 'methods' do

    subject { FactoryGirl.build(:coaster) }

    it "should return a formatted string of coaster name at park name" do
        name_and_park.should eq('Nemesis at Alton Towers')
    end

  end

Coaster.rb:

  def name_and_park
    [name, park.name].join (' at ')
  end

运行测试时出错:

2) 过山车方法应该返回一个格式化的过山车名称字符串 公园名称 失败/错误:name_and_park.should eq('Nemesis at Alton Towers') 名称错误: '

中未定义的局部变量或方法name_and_park' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_6:0x007f84f4161798> # ./spec/models/coaster_spec.rb:111:inblock(3 级)

它说 name_and_park 不能被调用,但肯定应该在主题行中创建的 Coaster 实例上调用该方法?没有?

【问题讨论】:

  • 这是与您之前提到的测试不同的三种测试。你之前的问题现在回答了吗?该测试现在通过了吗?
  • 要回答这个关于validate_presence_of 结果的新问题,查看您的模型和测试结果会有所帮助。
  • respond_to 问题只是我不了解每条测试线正在运行的一个例子。立即将模型和测试结果添加到 OP。

标签: ruby-on-rails testing rspec factory-bot shoulda


【解决方案1】:

它在“主题”上运行,该主题要么通过subject 方法显式定义,要么通过将类作为参数传递给describe 隐式定义,在这种情况下,该类的实例被实例化并生成测试的主题。见https://www.relishapp.com/rspec/rspec-core/v/2-0/docs/subject/explicit-subjecthttps://www.relishapp.com/rspec/rspec-core/v/2-0/docs/subject/implicit-subject

至于更新问题的答案,在您对:speed:length 的模型验证中,您有allow_nil: true,这就是这两个测试失败的原因。 validates_presence_of 的部分定义是 nil 不是可设置的值。

至于你最近的问题,我想你可能对隐式主题的使用感到困惑。如果 should 单独使用,它确实会默认为 subject 是什么,但如果你自己包含一个主题,就像你在这种情况下使用 name_and_park 一样,它不会将其视为一种方法默认主题,它必须在当前命名空间中有一个定义。在你的情况下,你需要说subject.name_and_park.should ...

另一方面,当您提出特定问题或相关问题集并获得答案时,最好使用 StackOverflow。由于各种原因,它不适用于正在进行的调试会话。其中一个原因是跟踪原始问题和答案的大量连续更新变得乏味。

【讨论】:

  • 好的,更新我的 OP 并提出更多问题
  • 我对与此类似的问题有一个简短的问题,如果您能提供帮助,请在 OP 底部添加?
  • 好的,在 SO 方面理解。将完成此问题并将此问题留在那里。将使用额外的代码和错误更新 OP
  • 我刚刚意识到我没有仔细阅读您更新的问题。请参阅我更新的(再次)答案。 :-)
  • @rctneil 实际上,validate_presence_of 测试失败了,因为模型甚至没有验证这些属性的存在。 (此外,存在验证器会忽略 :allow_nil 和 :allow_blank。)
猜你喜欢
  • 2013-09-12
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多