4

次のコードは機能しませんが、私が達成しようとしていることを最もよく示しています

context "this context describes the class" do

  subject do
    # described class is actually a module here
    c = Class.new.extend(described_class)
    c.some_method_that_has_been_added_through_extension
    c
  end

  # ... testing the class itself here ...

  context "instances of this class" do

    subject do
      # this doesn't work because it introduces a endless recursion bug
      # which makes perfectly sense
      subject.new
    end

  end

end

また、サブジェクトで初期化した内部コンテキストでローカル変数を使用しようとしましたが、うまくいきませんでした。内部スコープのサブジェクト定義内から外部スコープのサブジェクトにアクセスする方法はありますか?

4

3 に答える 3

3

#subject を使用すると、問題が発生することがあります。#it​​s のような省略形チェックで使用することを「主に意図」しています。

また、テスト対象の名前/意図を隠すことができるため、例が読みにくくなる可能性があります。これは、David Chelimsky が#subjectと #let のトピックと、意図を明らかにする上でのそれらの役割について書いたブログ投稿です。件名/

代わりに let を使用してみて ください https://www.relishapp.com/rspec/rspec-core/v/2-10/docs/helper-methods/let-and-let

これが私が最も可能性の高い書き方です。

context "this context describes the class" do
  let(:name_of_the_module) { Class.new.extend(described_class) }
  before do
    c.some_method_that_has_been_added_through_extension
  end

  # ... testing the class itself here ...

  context "instances of this class" do

    let(:better_name_that_describes_the_instance) { klass.new }

    # ... test the instance
  end

end

SIDENOTE 件名を使用するかどうかを再検討することをお勧めします。ほとんどすべての場合に #let を使用することを好みます。YMMV

于 2012-05-26T12:05:35.057 に答える
1

明らかに機能するのは、内部コンテキストでインスタンス変数を使用し、それをではなく代わりに初期化することです。主題はProcsです。したがって、私の最初のアプローチはうまくいきませんでした。subjectsubject.call

context "instances of this class" do

  klass = subject.call
  subject { klass.new }

end
于 2012-05-11T10:59:02.270 に答える