3

これは、RSpec で使用する優れた手法であり、Shoulda および Shoulda-context を使用するプロジェクトでも使用したいと考えています。しかし、それが可能かどうかはわかりません。これを行う方法はありますか?

私が欲しいもの:ネストされたコンテキストの句を参照する外側のコンテキストでsetup( ) ブロックを定義します。そうすれば、内部コンテキストは、外部で参照される値を構成でき、内部コンテキスト全体で DRY のままにすることができます。beforeletsetupsetup

RSpec の例 (この例は単純です。実際の例では、before複製したくないブロック内にもっと多くのコードがあると仮定してください):

describe Thing do
  before do
    # Notice that `user` isn't defined here--it's defined in `let` blocks
    # in nested contexts below.
    login_as user

    # Assume there's lots more code here that I would like to keep
    # DRY across contexts.
  end

  context "when logged in as an admin" do
    # THIS IS THE MAGIC RIGHT HERE:
    let(:user) { Factory(:user, role: "admin") }

    it "should ..." ...
  end

  context "when logged in as a normal user" do
    # THIS IS THE MAGIC RIGHT HERE:
    let(:user) { Factory(:user) }

    it "should ..." ...
  end
end

要約すると、shoulda-context と Test::Unit を使用してこれを行うにはどうすればよいですか?

私がすでに試したいくつかのことはうまくいきませんでした:

  • def各サブコンテキストでメソッドを再定義します。
  • before_should各サブコンテキストで。
4

1 に答える 1

3

テスト間で繰り返されるコードを引き出すのに役立つ、テスト クラス内のヘルパー メソッドを見つけました。このような:

class MyTest < TestCase
  context "when logged in as an admin" do
    setup do
      do_login Factory(:user, role: "admin")
    end

    should "..." do
      ...@user...
    end
  end

  context "when logged in as an admin" do
    setup do
      do_login Factory(:user)
    end

    should "..." do
      ...@user...
    end
  end

  def do_login(user)
    login_as user
    @user = user

    # lots more setup code here...
  end
end
于 2013-08-14T17:13:35.173 に答える