2012-04-16 2 views
2

Я использую драгоценный камень и хочу добавить к нему еще 40 дополнительных тестов rspec. Драгоценный камень поставляется с набором спецификаций, но они не очень DRY - каждый из 40+ тестов, которые я хочу добавить, потребует 10-12 строк кода (каждый из них очень похож).Как высушить этот тест rspec?

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

Вот суть: https://gist.github.com/2400225

То, что я хочу сделать, это иметь 40-45 из этих тестов в одном исходном файле, который, как DRY, как имеет смысл.

shared_examples_for "Firefox browser" do 
    it "should return 'Firefox' as its browser" do 
    @useragent.browser.should == "Firefox" 
    end 

    it "should return :strong as its security" do 
    @useragent.security.should == :strong 
    end 

    it { @useragent.should_not be_webkit } 
end 

# (repeating code would start here. I want 40-50 of these blocks.) 
describe 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8' do 
    before do 
    @useragent = UserAgent.parse('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8') 
    end 

    it_should_behave_like "Firefox browser" 

    it "should return '4.0b8' as its version" do 
    @useragent.version.should == "4.0b8" 
    end 

    it "should return '20100101' as its gecko version" do 
    @useragent.gecko.version.should == "20100101" 
    end 

    it "should return 'Macintosh' as its platform" do 
    @useragent.platform.should == "Macintosh" 
    end 

    it "should return 'Intel Mac OS X 10.6' as its os" do 
    @useragent.os.should == "Intel Mac OS X 10.6" 
    end 

    it "should return nil as its localization" do 
    @useragent.localization.should be_nil 
    end 

    it { @useragent.should_not be_mobile } 
end 

ответ

3

Это просто рубин!

Вы можете сделать что-нибудь здесь, что вы можете сделать в рубине. Попробуйте что-то вроде этого:

BROWSERS = [ 
    [ 
     'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8', 
     'Firefox browser', 
     '4.0b8', 
     '20100101', 
     'Macintosh', 
     'Intel Mac OS X 10.6', 
     nil, 
     false 
    ], 
    # more entries 
] 

BROWSERS.each do |desc| 
    agent_string,behave_as,version,gecko_version,platform,os,localization,mobile = *desc 
    describe agent_string do 
     before do 
     @useragent = UserAgent.parse(agent_string) 
     end 

     it_should_behave_like behave_as 

     it "should return '#{version}' as its version" do 
     @useragent.version.should == version 
     end 

     it "should return '#{gecko_version}' as its gecko version" do 
     @useragent.gecko.version.should == gecko_version 
     end 
     # etc! 
     end 
end 
+0

Хороший ответ. Я бы добавил данные браузера в хэш, поэтому описания полей находятся рядом со значениями. –

+0

Вот аналогичная, очищенная версия https://gist.github.com/2401393, сделанная https://github.com/croaky –

+0

Обратите внимание, что этот вопрос использует старый синтаксис 'should' от RSpec 2. Если вы запуская RSpec 3 и вы хотите скопировать его, обязательно используйте новый синтаксис 'expect'. – williamcodes

Смежные вопросы