Capybara与FactoryGirl?

时间:2016-11-30 20:02:53

标签: ruby-on-rails capybara factory-bot

所以我想确保这是可能的,并且实际上可以用我想做的事情。

我之前一直在使用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我似乎没有看到数据库中的实际数据被填充(这可能是困难的,因为一旦规范被删除,它就被删除了吗?)但我无法判断它是否真正创建了数据。

谢谢!

1 个答案:

答案 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')