在 RSpec 中出现未定义的方法错误

Getting undefined method error in RSpec

我正在使用 RSpec 和 FactoryGirl 来测试我的模型,但我被困在 "highest_priority" 方法中,由于某种原因 RSpec 看不到它。

这是方法本身:

models/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

我收到以下错误:

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

 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

我得到

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

class Task < ActiveRecord::Base

  #some stuff

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

首先,你最好使用ActiveRecord的maximum,而不是先排序再挑一个,你会避免实例初始化,直接从查询中得到一个数字

Task.maximum(:priority)

这可以像这样放在 class 方法中

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

然后对于更新方法的下半部分,我会为此创建一个实例方法,并使用 class 方法

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

  self
end

请注意,为了链式化,我在最后返回了 self

那么你的动作就会变成这样

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