0

私はまだRSpecに慣れていて、マルチテナントアプリのテストを設定するときに問題が発生しています。

アプリは次の場所で動作します:

client1.example.com

client2.example.com

等....

私のRSpecでは、次のことを行っています。

let(:tenant) { FactoryGirl.create(:tenant, subdomain: "client1") }
let(:root_path) { "http://client1.example.dev:3000" }

before {
  tenant.save
  visit root_path
}

describe "header" do
   it "should have the right title" do
     page.should have_selector('title', :text => tenant.name)
   end
end

私はここで間違っていると感じるいくつかのことをしていますが、最善のアプローチが何であるかわかりません。

  1. root_pathをハードコーディングしています。visit '/'テストは正しいサブドメインが何であるかを知らないため、のようなことをしても機能しません。これでいい?

  2. 理由はわかりませんが、テストでサブドメインに基づいて実際にテナントを見つけることができるようにするには、各テストの前にtenant.saveを実行する必要があります。Tenant.saveを削除すると、Couldn't find Tenant with subdomain = client1エラーが発生します。FactoryGirl.createが実際にデータベースに保存されていると思いましたか?

助けてくれてありがとう!

4

1 に答える 1

0

1:このように思えますが、サブドメインだけを指定する方法はないと思います。

2:はい、createデータベースに保存します(保存しbuildません)。ただし、RSpecletは怠惰であり、最初に呼び出されたときにのみ評価されます。

つまりtenant.save、テナントがなければ、テナントは発生するまで作成されませんでした。呼び出しpage.should have_selector('title', :text => tenant.name)後、visit遅すぎます。

幸い、RSpeclet!はの熱心なバージョンも提供しているletので、それを使用する場合はtenant.savebeforeブロック内にを必要としません。

于 2013-01-15T01:51:53.670 に答える