多租户和rspec

时间:2013-01-15 01:36:48

标签: rspec factory-bot multi-tenant

我在使用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实际保存到了数据库?

  3. 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

1:似乎有必要这样做,我认为没有办法只指定子域名。

2:是的,create保存到数据库(build没有)。但是,RSpec的let是懒惰的 - 它只会在第一次调用它时进行评估。

这意味着如果没有tenant.save,则page.should have_selector('title', :text => tenant.name)发生后才会创建租户 - 在visit电话之后,为时已晚。

幸运的是,RSpec还提供了let!这是let的热切版本,所以如果您使用它,则不需要tenant.save块中的before