所以我想确保这是可能的,并且实际上可以用我想做的事情。
我之前一直在使用seeds.rb
文件为数据库提供测试数据,这对我的Capybara集成测试很有用,但搞砸了一些依赖于schema.rb
文件的其他单元测试工厂创建数据。
我可以使用工厂为该特定集成规范创建测试数据。对于工厂来说这样的事情:
FactoryGirl.define do
factory :user do
first_name Faker::Name.first_name
last_name Faker::Name.last_name
email Faker::Internet.email
password "password"
end
end
然后我有一个超级简单的规范登录到Capybara的网站:
it 'Check correct login' do
visit('/sign_in')
page.fill_in 'user_email', :with => 'test@test.com'
page.fill_in 'user_password', :with => 'p4ssw0rd'
click_button('Sign In')
end
这是一个Sqlite数据库,我可以插入我的工厂,它将使用capybara吗?我真的不熟悉factorygirl,但它实际上是在数据库中创建数据然后只是删除它?
在我在网上搜索的很多例子中,我不常见Capybara与FactoryGirl一起使用,这是否有原因?
编辑: 这是我目前的情况:
it 'Check correct login' do
user = FactoryGirl.create(:user)
visit('/d/users/sign_in')
page.fill_in 'user_email', :with => user.email
page.fill_in 'user_password', :with => user.password
click_button('Log In')
page.assert_text('Signed in successfully.')
end
我能够截取屏幕截图并确认表单已填写随机用户名/密码,但使用数据库浏览器进行SQlite我似乎没有看到数据库中的实际数据被填充(这可能是困难的,因为一旦规范被删除,它就被删除了吗?)但我无法判断它是否真正创建了数据。
谢谢!
答案 0 :(得分:1)
这应该很好,没有很多故障。您需要在测试中实例化您的User对象,因为这看起来像是“登录”。
您可以通过几种不同的方式创建对象。
(1)
describe 'Test' do
let(:user){ create :user }
...
it 'Specific Test' do
...
请注意,let!(:user){...}
会立即创建,而let(:user){...}
只会在调用user
时创建用户。然后,您就可以在所有测试中访问user
。
(2)
describe 'Test' do
before do
@user = FactoryGirl.create( :user )
end
it 'Specific Test' do
...
在这里,您可以在所有测试中访问@user
。
请告诉我们这是否有效,如果不是,那么您会得到什么错误。
编辑:
如果您的FG文件如下所示:
FactoryGirl.define do
factory :user do
first_name Faker::Name.first_name
last_name Faker::Name.last_name
email Faker::Internet.email
password "password"
work
end
end
你可以将这样的工作联系起来:
let(:user){ create :user, work: 'Some Place' }
@user = FactoryGirl.create(:user, work: 'Some Place')