Rspec Rails - имя должно быть действительным - некоторые пояснения - PullRequest
6 голосов
/ 23 февраля 2011

В эти дни я увлекаюсь 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, как это можно интегрировать?

EDIT:

Может, так лучше?

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 ]

15 голосов
/ 23 февраля 2011

Вы, вероятно, ищете совпадение 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
5 голосов
/ 23 февраля 2011

Я использую этот способ:

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 голосов
/ 23 февраля 2011

Мне нравится проверять фактические сообщения об ошибках для проверок:

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 голосов
/ 23 февраля 2011

Я бы использовал что-то похожее на это

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

Самое заметное, что я использую активные проверки записей для обоих условий.В моих примерах я не полагаюсь на строки ошибок.В примерах, которые проверяют поведение валидаций, нет причин прикасаться к базе данных, поэтому я этого не делаю.В каждом примере я проверяю поведение объекта, когда оно является действительным и недействительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...