1

テンプレート メソッド デザイン パターンを使用する 2 つのクラスがあるとします。

def Parent
  def all_params
    params.merge(extra_params)
  end

  def params
    {blah: "cool"}
  end

  def extra_params
    {}
  end
end

def Child < Parent
  def extra_params
    {edmund: "coolest"}
  end
end

Rspecでこれをテストする適切な方法は何ですか? このように作成してから、両方のクラスでshared_examples_for "a parent"使用してテストする必要がありますか?:it_should_behave_like 'a parent'

shared_examples_for "a parent" do
  describe "#params" do
    expect(subject.params).to eq (...)
  end

  describe "#all_params" do
    expected_params = subject.all_params.merge(subject.extra_params)
    expect(subject.all_params).to eq expected_params
  end
end

describe Parent do
  subject { Parent.new }
  it_should_behave_like 'a parent'

  describe "#extra_params" do
    expect(subject.extra_params).to eq {}
  end
end

describe Child do
  subject { Child.new }
  it_should_behave_like 'a parent'

  describe "#extra_params" do
    expect(subject.extra_params).to eq {edmund: 'coolest'}
  end
end

それともChild、親であることをテストし、それが上書きするフックメソッドのみをテストする必要がありますか?

describe Parent do
  subject { Parent.new }
  describe "#params" do
    expect(subject.params).to eq (...)
  end

  describe "#all_params" do
    expected_params = subject.all_params.merge(subject.extra_params)
    expect(subject.all_params).to eq expected_params
  end

  describe "#extra_params" do
    expect(subject.extra_params).to eq {}
  end
end

describe Child do
  subject { Child.new }
  it "is a Parent" do
    expect(subject).to_be kind_of(Parent)
  end

  describe "#extra_params" do
    expect(subject.extra_params).to eq {edmund: 'coolest'}
  end
end
4

2 に答える 2

0

私は 2 番目の例を好みます。it_behaves_like "a parent"in の使用Childは重複しており、基本的には継承が Ruby で機能するかどうかをテストするだけです。

于 2015-06-26T18:08:13.607 に答える
0

それは選択の問題です。個人的には、親クラスの共有例を作成してから、親の例を作成します。Animal

include_examples 'Animal'

そして例えばのためにBadger < Animal

it_behaves_like 'Animal'

1 つ目は現在のコンテキストに例を含め、2 つ目は例をbehaves like Animalコンテキストにラップします。

于 2015-06-26T14:09:33.820 に答える