在 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
我正在使用 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