gpt4 book ai didi

ruby-on-rails-3 - Rspec/Rails 和测试 validates_uniquess_of 范围

转载 作者:行者123 更新时间:2023-12-02 07:03:40 25 4
gpt4 key购买 nike

这是我的测试代码:

require 'spec_helper'

describe Classroom, focus: true do

let(:user) { build_stubbed(:user) }

describe "associations" do
it { should belong_to(:user) }
end

describe "validations" do
it { should validate_presence_of(:user) }
it { should validate_uniqueness_of(:name).scoped_to(:user_id) }

context "should create a unique classroom per user" do

before(:each) do
@class = build_stubbed(:classroom, name: "Hello World", user: user)
@class2 = build_stubbed(:classroom, name: "Hello World", user: user)
end

it "should not create the second classroom" do
@class2.should have(1).errors_on(:name)
end
end
end

describe "instance methods" do

before(:each) do
@classroom = build_stubbed(:classroom)
end

describe "archive!" do

context "when a classroom is active" do
it "should mark classroom as inactive" do
@classroom.stub(:archive!)
@classroom.active.eql? false
end
end

end

end

end

这是我的类模型:

class Classroom < ActiveRecord::Base
attr_accessible :user, :name

belongs_to :user

validates :user, presence: true
validates_uniqueness_of :name, scope: :user_id, message: "already exists"

def archive!
update_attribute(:active, false)
end
end

当我运行测试时,我收到以下错误:

1) Classroom validations 
Failure/Error: it { should validate_uniqueness_of(:name).scoped_to(:user_id) }
Expected errors to include "has already been taken" when name is set to "arbitrary_string", got errors: ["user can't be blank (nil)", "name already exists (\"arbitrary_string\")"]
# ./spec/models/classroom_spec.rb:13:in `block (3 levels) in <top (required)>'

2) Classroom validations should create a unique classroom per user should not create the second classroom
Failure/Error: @classroom2.should have(1).errors_on(:name)
expected 1 errors on :name, got 0
# ./spec/models/classroom_spec.rb:24:in `block (4 levels) in <top (required)>'

我对编写测试相当陌生(尤其是使用 Rspec)。只是想找人就我做错了什么给我一些建议。

最佳答案

  1. 第一次验证失败 :
    在您的模型中,您已经覆盖了 rspec 为唯一性验证生成的默认消息。因此,在测试此类验证时,您必须使用 shoulda 的 'with_message' 选项。所以测试应该像
    “它{应该 validate_uniqueness_of(:name).scoped_to(:user_id) }.with_message('already exists')”

  2. 第二次验证失败:
    当您像第二个示例一样自己编写唯一性验证规范时,您必须创建一个已经存在于数据库中的记录,并使用类似的参数构建第二个记录。那么这条重复的记录将无效,并且会出现预期的错误。
    所以在 before(:each) block 中,将第一条@classroom 记录保存在数据库中,而不是仅仅构建它

关于ruby-on-rails-3 - Rspec/Rails 和测试 validates_uniquess_of 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com