2012-11-18 84 views
1

我认为这可能与issues I described in this question有关。水豚和工厂女生的“电子邮件已被采纳”错误

我不明白为什么使用Factory Girl创建用户工厂时,Capybara无法在我的Rails应用上测试注册表单。我不断收到email has already been taken错误。这里是我厂:

FactoryGirl.define do 
    sequence :email do |n| 
    "email#{n}@example.com" 
    end 

    factory :user do 
    email 
    password "secret" 
    password_confirmation "secret" 
    end 
end 

这里是我的注册试验:

require "test_helper" 

describe "Signup integration" do 

    before(:each) do 
    visit signup_path 
    end 

    it "successfully routes to the signup page" do 
    page.text.must_include "Sign Up" 
    end 

    it "signs up a new user" do 
    user = FactoryGirl.create(:user) 
    fill_in "user_email", :with => user.email 
    fill_in "Password", :with => user.password 
    fill_in "Password confirmation", :with => user.password_confirmation 
    click_button "Create User" 
    current_path == "/" 
    page.text.must_include "Signed up!" 
    end 
end 

这是我的test_helper.rb中:

ENV["RAILS_ENV"] = "test" 
require File.expand_path("../../config/environment", __FILE__) 
require "minitest/autorun" 
require "capybara/rails" 
require "active_support/testing/setup_and_teardown" 

class IntegrationTest < MiniTest::Spec 
    include Rails.application.routes.url_helpers 
    include Capybara::DSL 
    register_spec_type(/integration$/, self) 

    def last_email 
    ActionMailer::Base.deliveries.last 
    end 

    def reset_email 
    ActionMailer::Base.deliveries = [] 
    end 
end 

class HelperTest < MiniTest::Spec 
    include ActiveSupport::Testing::SetupAndTeardown 
    include ActionView::TestCase::Behavior 
    register_spec_type(/Helper$/, self) 
end 

Turn.config.format = :outline 

我真的不知道这可能是错。如果我将Capybara save_and_open_page方法添加到每行中,它可以一直到达密码字段,但是Capybara无法填写密码字段。它会在电子邮件字段中添加一个唯一的电子邮件地址,如[email protected],但不能添加Factory Girl密码。如果我在测试中输入一个纯文本密码(fill_in "Password", :with => "password")它可以填写该字段,但这似乎并不是测试该方法的正确方法。到登录测试,我也有在应用程序以及可以问题是,水豚登录作为另一个用户从登录测试?如果是这样,你如何清理会话你的测试?

最后,这里是我的Gemfile,如果是相关的:

source 'https://rubygems.org' 

gem 'rails', '3.2.8' 
gem 'jquery-rails' 
gem 'pg' 
gem 'heroku' 
gem 'taps' 
gem 'sorcery' 
gem 'bootstrap-sass' 
gem 'simple_form' 

group :assets do 
    gem 'sass-rails', '~> 3.2.3' 
    gem 'coffee-rails', '~> 3.2.1' 
    gem 'uglifier', '>= 1.0.3' 
end 

group :test do 
    gem 'minitest' 
    gem 'capybara' 
    gem 'capybara_minitest_spec' 
    gem 'turn' 
    gem 'factory_girl_rails' 
end 
+0

不使用databasecleaner后清理数据库?良好的做法是在运行测试之前在数据库中有一个良好定义的状态。否则很难预测结果。 – froderik

回答

3

这个问题可能是在这一行

user = FactoryGirl.create(:user) 

尝试将其更改为

user = FactoryGirl.build(:user) 

FactoryGirl.create创建用户对象的实例,并将其保存到数据库中。 build创建一个实例,但不保存到数据库。

+1

在'user = FactoryGirl.build(:user)'中使用'build'修复了注册测试。这是有道理的,你可以建立一个用户来测试注册过程,但我的登录测试仍然失败。当使用'FactoryGirl。创建(:用户)'因为电子邮件地址已被占用而失败。当我使用'user = FactoryGirl.build(:user)'时,它失败了,因为它无法正确提交登录表单。你不需要使用'create'而不是build来测试登录,因为用户需要在数据库中登录吗?我将尝试添加database_cleaner来解决此问题。 –

1

数据库滤清器帮助我..

的Gemfile

gem 'database_cleaner' 

minitest_helper.rb

class MiniTest::Spec 
    include FactoryGirl::Syntax::Methods 
    before :each do 
     DatabaseCleaner.clean 
    end 
    end 
0

发生这种情况,因为你使用的是相同的值应该是电子邮件列独特

可以使用gem fakegem database_cleaner在你的Gemfile中的group :development, test

伪装者允许您为您的记录生成随机值,而database_cleaner创建记录

相关问题