我在使用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
我做了一些在这里感觉不对的事情,但不确定最好的方法是什么。
我很难编写root_path。像visit '/'
这样的操作不起作用,因为测试不知道正确的子域是什么。这样可以吗?
我不知道为什么,但我必须在每次测试之前做tenant.save,以便测试实际上能够找到基于子域的租户。如果我删除tenant.save,我会收到Couldn't find Tenant with subdomain = client1
错误。我以为FactoryGirl.create实际保存到了数据库?
感谢您的帮助!
答案 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
。