这些天我正在进入rspec,试图让我的模型更加精确和准确。关于rspec,有些事情对我来说仍然有些奇怪,所以我觉得如果有人能澄清那就好了。
假设我有一个用户模型。这个有一个:名字。名称应该在4..15个字符之间(这是次要目标,起初它必须存在)。所以现在我在想:以确保这种情况发生的方式测试它的最佳方法是什么。为了测试用户必须有一个名字,我写了这样的东西:
describe User do
let(:user) { User.new(:name => 'lele') }
it "is not valid without a name" do
user.name.should == 'lele'
end
end
现在,我不太确定这完全符合我的要求。在我看来,我实际上正在测试这个Rails。此外,如果我想检查名称不能超过15个字符且小于4个字符,那么如何将其集成?
编辑:
也许这更好?
describe User do
let(:user) { User.new(:name => 'lele') }
it "is not valid without a name" do
user.name.should_not be_empty
end
end
答案 0 :(得分:15)
您可能正在寻找be_valid
匹配器:
describe User do
let(:user) { User.new(:name => 'lele') }
it "is valid with a name" do
user.should be_valid
end
it "is not valid without a name" do
user.name = nil
user.should_not be_valid
end
end
答案 1 :(得分:5)
我用这种方式:
describe User do
it "should have name" do
lambda{User.create! :name => nil}.should raise_error
end
it "is not valid when the name is longer than 15 characters" do
lambda{User.create! :name => "im a very looooooooong name"}.should raise_error
end
it "is not valid when the name is shorter than 4 characters" do
lambda{User.create! :name => "Tom"}.should raise_error
end
end
答案 2 :(得分:2)
我喜欢测试验证的实际错误消息:
require 'spec_helper'
describe User do
let (:user) { User.new }
it "is invalid without a name" do
user.valid?
user.errors[:name].should include("can't be blank")
end
it "is invalid when less than 4 characters" do
user.name = "Foo"
user.valid?
user.errors[:name].should include("is too short (minimum is 4 characters)")
end
it "is invalid when greater than 15 characters" do
user.name = "A very, very, very long name"
user.valid?
user.errors[:name].should include("is too long (maximum is 15 characters)")
end
end
使用构建具有有效属性的对象的工厂也很有帮助,您可以一次使一个对象无效以进行测试。
答案 3 :(得分:0)
我会使用与此类似的东西
class User < ActiveRecord::Base
validates_presence_of :name
validates_length_of :name, :in => 4..15
end
describe User do
it "validates presence of name" do
user = User.new
user.valid?.should be_false
user.name = "valid name"
user.valid?.should be_true
end
it "validates length of name in 4..15" do
user = User.new
user.name = "123"
user.valid?.should be_false
user.name = "1234567890123456"
user.valid?.should be_false
user.name = "valid name"
user.valid?.should be_true
end
end
最值得注意的是,我正在对两种情况使用有效记录验证。在我的例子中,我不依赖于错误字符串。在测试验证行为的示例中,没有理由触及数据库,所以我没有。在每个例子中,我测试了对象的有效和无效的行为。