Rspec Rails - 名称应该是有效的 - 一些澄清

时间:2011-02-22 21:22:53

标签: ruby-on-rails rspec

这些天我正在进入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

4 个答案:

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

最值得注意的是,我正在对两种情况使用有效记录验证。在我的例子中,我不依赖于错误字符串。在测试验证行为的示例中,没有理由触及数据库,所以我没有。在每个例子中,我测试了对象的有效和无效的行为。