2011-02-22 24 views
6

我进入rspec这些天,试图让我的模型更精确和准确。有些事情对我来说还是有点奇怪,所以我认为如果有人能够澄清,这将会很好。Rspec Rails - 名称应该是有效的 - 一些澄清

比方说,我有一个用户模型。这个有一个:名字。该名称应该在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 

回答

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 
+1

请注意,所有.create!方法撞击数据库并使测试速度降低了100倍。您可以使用@Dylan Markow的以下说明避免缓慢并仍然检查有效性。 – aaandre 2013-11-06 00:00:09

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

使用建立具有有效属性的对象的工厂也很有帮助,您可以一次使其中的一个无效,以便进行测试。

+0

非常有趣的做法,thanx – Spyros 2011-02-23 00:00:33

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 = "123456789" 
    user.valid?.should be_false 
    user.name = "valid name" 
    user.valid?.should be_true 
    end 
end 

最引人注目的是,我使用的活动记录验证了这两个条件。在我的例子中,我不依赖错误字符串。在测试验证行为的示例中,没有理由触及数据库,所以我不这样做。在每个示例中,我测试对象在有效和无效时的行为。