СУХОЙ Проблема с Rspec, как я могу это исправить - PullRequest
2 голосов
/ 11 декабря 2010

Я новичок в Ruby и Rspec. Я пишу свой первый тест RSpec, и я думаю, что мой код не очень хорошо. Но я не знаю, как я могу сделать это лучше.

В этом файле я проверю свой класс адресов. First_name и last_name одинаковы, но у меня есть два больших блока для него. Как я могу изменить свой код? И что такое хороший способ проверить RegExp.

Спасибо.

specify { Factory.build(:address).should be_valid }


  ### first_name ###

  it "should be invalid without an first_name" do
    Factory.build(:address, :first_name => nil).should_not be_valid
  end


  context "first_name" do

    it "should be invalid with more than 20 chars" do
      Factory.build(:address, :first_name => "#{'b'*21}").should_not be_valid
    end

    it "should be invalid with less than 3 chars" do
      Factory.build(:address, :first_name => "ll").should_not be_valid
    end

    it "should be valid with an valid first_name" do      
       valid_names.each do |name|
        Factory.build(:address, :first_name => name).should be_valid
       end
    end

    it "should be invalid with an invalid first_name" do
      invalid_names.each do |name|
        Factory.build(:address, :first_name => name).should_not be_valid
      end
    end    
  end


  ### last_name ###

  it "should be invalid without an last_name" do
    Factory.build(:address, :last_name => nil).should_not be_valid
  end

  context "last_name" do
    it "should be invalid with more than 20 chars" do
      Factory.build(:address, :last_name => "#{'b'*21}").should_not be_valid
    end

    it "should be invalid with less than 3 chars" do
      Factory.build(:address, :last_name => "ll").should_not be_valid
    end

    it "should be valid with an valid last_name" do      
       valid_names.each do |name|
        Factory.build(:address, :last_name => name).should be_valid
       end
    end

    it "should be invalid with an invalid last_name" do
      invalid_names.each do |name|
        Factory.build(:address, :last_name => name).should_not be_valid
      end
    end    
  end
 def valid_names    
    ["Kai","Ülück's","Schmeißtzs","Rald","Dr. Franzen","rolfes","Lars Michael","Öcück","Mark-Anthony"] 
  end

  def invalid_names    
    ["-#+*32","         ","a& &lkdf","_-_.l##df"," aaadsa","M€lzer"]
  end

Ответы [ 2 ]

1 голос
/ 11 декабря 2010

Помните, что ваши тесты не должны быть очень сухими. Не жертвуйте читабельностью ради него.

Думайте о своих характеристиках как о примерах: какие примеры должны быть действительными, а какие - нет? Это также ключ к тестированию регулярных выражений: приведите несколько примеров, которые проходят, а некоторые - нет.

Для проверки я сделал несколько пользовательских сопоставлений, которые можно найти здесь . Пример:

describe Address do
  it { should deny(:last_name).to_be(nil, "", "1", "br", "a& &lkdf","_-_.l##df", "lzer") }
  it { should allow(:last_name).to_be("Kai","Ülück's","Schmeißtzs","Rald","Dr. Franzen","rolfes","Lars Michael","Öcück","Mark-Anthony") }
end
1 голос
/ 11 декабря 2010

вот как я иногда делаю такие вещи:

describe Address do
  describe "validations" do
    before do
      @address = Factory(:address)
    end
    describe "#first_name" do
      #prove that your factory is correct
      it "should be valid" do
        @address.should be_valid
      end
      it "should be less than 20 chars" do
        @address.name = "0" * 20
        @address.should_not be_valid
      end
      it "should be more than 3 chars" do
        @address.name = "000"
        @address.should_not be_valid
      end
    end
  end
end
...