Прохождение теста RSPEC, которое должно провалиться - PullRequest
0 голосов
/ 14 сентября 2011

Я использую rspec, rails, guard и волшебство для своей аутентификации и тестирования.

У меня есть тест, который проверяет длину электронной почты.Я хочу отклонить слишком длинные электронные письма.Вот тест, который я написал для spec / models / user_spec.rb

    require 'spec_helper'

    describe User do
     before(:each) do
       @attr = { :email => "testuser@example.com", :password => "password", :password_confirmation => "password" }
     end


     it "should reject emails that are too long" do
       long_email = "a" * 101 + "gmail.com"
       long_email = User.new (@attr.merge(:email => long_email))
       long_email.should_not be_valid
     end

Вот проверки моделей, которые у меня есть:

class User < ActiveRecord::Base
  authenticates_with_sorcery!

  attr_accessible :email, :password, :password_confirmation

  validates_presence_of :password, :on => :create
  validates :password, :confirmation => true,
                       :length       => { :within => 6..100 }

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, :presence        => true,
                    :format          => { :with => email_regex },
                    :uniqueness      => {:case_sensitive => false},
                    :length          => { :within => 5..100 }
end

Я новичок в этом деле, поэтому любая помощь будет принята с благодарностью.Тест зеленый сейчас, он становится красным, если я поменяю строку на long_email.should be_valid.Заранее спасибо!

1 Ответ

1 голос
/ 14 сентября 2011

Как указывает @apneadiving, формат теста важен. Это не только облегчает чтение, но и показывает места, которые вы не тестировали:

require 'spec_helper'

describe User do
  let(:attr){ 
    {:email => "testuser@example.com", :password => "password", :password_confirmation => "password" }
  }

  context "When given an email address" do
    context "That is too long" do
      let(:long_email){ "a" * 101 + "gmail.com" }
      subject{ User.new attr.merge(:email => long_email) }

      specify{ subject.should_not be_valid }
    end
    context "That is too short" do
      pending
    end
    context "That is between 5 and 100 characters long"
      pending
    end
  end

end

Как видите, переписывание кода сделало несколько вещей:

  • облегчил чтение
  • облегчает добавление большего количества тестов, не влияя на более ранние тесты, которые влияют на более поздние (используя let вместо before)
  • показал, что вы указали только неудачный случай, и не проверен на положительный случай (или другие случаи)

Если вы напишите положительный случай, и это тоже пройдет, тогда вы действительно поймете, что что-то не так!

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