在RSpec中获取未定义的方法错误

时间:2015-08-11 10:22:13

标签: ruby-on-rails rspec model automated-tests factory-bot

我正在使用RSpec和FactoryGirl来测试我的模型而且我坚持使用“high_priority”方法,这是RSpec因某些原因无法看到的。

这是方法本身:

模型/ task.rb

class Task < ActiveRecord::Base

#some stuff

 def self.highest_priority
    p = Task.order(:priority).last.try(:priority)
    p ? p + 1 : 1
  end
end

当我运行 task_spec.rb

require 'spec_helper'

describe Task do

it "returns highest priority" do
  last_task = FactoryGirl.build(:task, priority: "5")
  last_task.highest_priority
  expect(last_task(:priority)).to eq("6")
 end
end

我收到以下错误: enter image description here

当我在我的控制器中调用此方法时,就像这样

 def create
    @task = current_user.tasks.build(task_params)
    @task.highest_priority
    @task.complete = false


    respond_to do |format|
      if @task.save
        format.js
      else
        format.js
      end
    end
  end

方法看起来像

  def highest_priority
    self.maximum(:priority).to_i + 1
  end

我正在

enter image description here

2 个答案:

答案 0 :(得分:1)

您需要将方法创建为Task模型的实例方法。如下所示:

class Task < ActiveRecord::Base

  #some stuff

  def highest_priority
    p = Task.order(:priority).last.try(:priority)
    p ? p + 1 : 1
  end
end

答案 1 :(得分:1)

首先,您最好使用ActiveRecord&#39; maximum而不是订购然后选择一个,您将避免实例初始化并直接从查询中获取数字

Task.maximum(:priority)

这可以放在像这样的类方法中

def self.maximum_priority
  Task.maximum(:priority) || 0 # fall back to zero if no maximum exists
end

然后对于正在更新方法的后半部分,我将为其创建一个实例方法,并使用类方法

def set_maximum_priority
  self.priority = self.class.maximum_priority + 1

  self
end

请注意,我最后为了可链接性而返回了自己

然后你的行动会变成这样的

def create
    @task = current_user.tasks.build(task_params).set_maximum_priority
    @task.complete = false
    ...
end