3

スキルアップのために、Michael Hartl の Rails チュートリアルに従って自分用の小さなアプリを作成しています。

ええと、私にとって最大の難点は TDD です...少し慣れてきましたが、この時点で小さな問題に直面しています。モデルの 1 つにパーセンテージである多くの属性があるため、多くの反復テストがあります。 .

モデル スペック ファイルのこれらの属性のテストをそのままリファクタリングしました。

describe Measure do

  let(:user) { FactoryGirl.create(:user) }
  before do
    @measure = user.measures.build(
                fat: 35.0,
                water: 48.0,
                muscle: 25.5,
                bmi: 33.0
              )
  end

  subject { @measure }

  describe 'validations' do

    describe 'percentage attributes validations' do

      percentages = %w[bmi fat muscle water]

      percentages.each do |percentage|

        describe "#{percentage} should be a number" do
          before { @measure.send("#{percentage}=".to_sym, 'value') }  
          it { should_not be_valid }
        end
      end

      percentages.each do |percentage|
        describe "#{percentage} should be positive" do
          before { @measure.send("#{percentage}=".to_sym, -1) }
          it { should_not be_valid }
        end
      end

      percentages.each do |percentage|
        describe "#{percentage} should be less or equal to 100" do
          before { @measure.send("#{percentage}=".to_sym, 100.01) }
          it { should_not be_valid }
        end
      end
    end
  end
end

しかし、これもかなり長いので、Rails チュートリアルの第 8 章で紹介されている RSspec Custom Matcher を作成するのは良い考えだと思いました。

だから私はこのようにテストを書くことができるように感じました

describe 'percentage attributes validations' do
  its(:bmi) { should be_a_percentage }
end

be_a_percentageカスタムマッチャーで。しかし、それを実装する方法がわからないので、私は立ち往生しています...これまでのところ、私は持っています:

RSpec::Matchers.define :be_a_percentage |percentage| do
  match |measure| do
    # What should I do ?
    # percentage is nil and number is the attribute value
    # I can't call be_valid on the Measure object
  end
end

別の電話をかけてみました

describe 'percentage attributes validations' do

  specify { @measure.bmi.should be_a_percentage }

end

カスタム マッチャー チェーンに関する情報を読みましたが、理解できません。

初投稿です、長くなってしまいましたがよろしくお願いします…

4

1 に答える 1

1

be_a_percentageこれはあなたの直接の質問に実際に答えているわけではありませんが、コードベースのサイズが大きくなるにつれて、カスタム定義された非表示のメソッドでテストを非表示にせずに、そのままにしておくことをお勧めします。少し冗長ではありますが、そのままにしておくことで、何をテストしているのかを理解し、be_a_percentage実際に何を意味するのかを考える必要がなくなります。なんといっても削減率がマイナスということはあります。私の2セント..

とにかく、コードの DRY に進むことができます。

shared_examples_for 'percentage' do |percentage|
  describe "#{percentage} should be a number" do
    before { @measure.send("#{percentage}=".to_sym, 'value') }  
    it { should_not be_valid }
  end

  describe "#{percentage} should be positive" do
    before { @measure.send("#{percentage}=".to_sym, -1) }
    it { should_not be_valid }
  end

  describe "#{percentage} should be less or equal to 100" do
    before { @measure.send("#{percentage}=".to_sym, 100.01) }
    it { should_not be_valid }
  end
end

describe 'validations' do
  describe 'percentage attributes validations' do

    percentages = %w[bmi fat muscle water]

    percentages.each do |percentage|
      it_should_behave_like 'percentage'
    end
  end
end

参考:RSpec共有例

于 2013-01-08T02:43:35.833 に答える