4

我已经开始在我的 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

但是测试失败了。有任何想法吗?

过山车.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) } 当速度设置为 nil 时,预期的错误包括“不能为空白”,没有错误 # ./spec/models /coaster_spec.rb:75:in `block (3 levels) in '

2) 过山车验证应该要求设置高度失败/错误:它 { 应该 validate_presence_of(:height) } 当高度设置为 nil 时,预期的错误包括“不能为空白”,没有错误 # ./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

过山车.rb:

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

运行测试时出错:

2) 过山车方法应在公园名称故障/错误处返回格式化的过山车名称字符串:name_and_park.should eq('Nemesis at Alton Towers') NameError: undefined local variable or method name_and_park' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_6:0x007f84f4161798> # ./spec/models/coaster_spec.rb:111:inblock (3 levels) in '

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

4

1 回答 1

3

它在“主题”上运行,该主题要么通过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/隐式主题

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

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

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

于 2013-08-08T20:43:27.040 回答