2

gemを使用していて、それに40以上のrspecテストを追加したいと思います。宝石には一連の仕様が付属していますが、それらはあまり乾燥していません。追加したい40以上のテストのそれぞれに、10〜12行のコードが必要です(それぞれが非常に似ています)。

テストのサンプルを以下に示しますが、より多くのコードを保持するための要点を作成しました。ここにもっとたくさん貼り付けるのは実用的ではないようです。

要点は次のとおりです: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
4

1 に答える 1

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
于 2012-04-16T19:33:08.507 に答える