0

我仍然熟悉 RSpec,并且在为我的多租户应用程序设置测试时遇到了一些问题。

该应用程序适用于:

client1.example.com

client2.example.com

ETC....

在我的 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

幸运的是,RSpec 还提供了let!一个急切的版本let,所以如果你使用它,你就不需要块tenant.save中的。before

于 2013-01-15T01:51:53.670 回答