2017-03-13 4 views
0

私はユーザー認証にDevise + Confirmable、テストにMinitest + Capybara +フィクスチャを使用しています。実行する前に、何らかの形式のログイン(ヘルパーlogin_as(@user)またはCapybaraのログインページに行く)と行@user.confirmを含む限り、ユーザーのテストにログインして作業させることができます。Devise + Confirmable + fixturesを正しく使うには

私はどのようにしてフィクスチャ自体のユーザーを確認できますか?しかし、毎回この行を含める必要はありません。 YMLで

confirmed_at: Time.now

が、違いを作るようには見えません。

は、今私が持っています。それは、説明のために役に立つかどうここ

は、作業サンプルテストです:

def setup 
    @user = users(:user) 
    end 

    test 'user should be redirected to profile edit on first login' do 
    @user.confirm 
    visit(new_user_session_path) 
    fill_in('user_email', :with => @user.email) 
    fill_in('user_password', :with => 'foobar') 
    click_button('Log in') 
    assert_current_path(edit_user_registration_path) 
    end 

とユーザー・フィクスチャ:

user: 
    email: [email protected] 
    confirmed_at: Time.now 
    encrypted_password: <%= Devise::Encryptor.digest(User, 'foobar') %> 
    sign_in_count: 0 
+0

したがって、ユーザーが作成、保存、まだ確認されなかったを確認することができ、必要に応じて?そのデータベースフィールドを手動で編集したいですか? –

+0

私が知っている限り、器具は実際にDBに保存されていません。開発DBのユーザーを見ると、2つのフィクスチャユーザーのどちらも存在しません。 – oneWorkingHeadphone

+0

こんにちは、私は私の答えを更新しました。問題の解決策が聞こえてきます。ガイドのように設定し、user.confirmメソッドを呼び出す必要があります。モジュール内ControllerMacrosメソッドdef login_user https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-(and-RSpec)#controller-仕様 –

答えて

1

私は私の答えを更新しました。問題の解決策が聞こえてきます。ガイドのように設定し、user.confirmメソッドを呼び出す必要があります。テストを含む完全な工夫RSpecのプロジェクトのモジュールControllerMacros方法のデフLOGIN_USER内部

https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-(and-RSpec)#controller-specs

オープンソースgithubのページ

https://github.com/RailsApps/rails-devise/blob/master/spec/features/users/sign_in_spec.rb


あなたは

User.confirmed_at = Time.now 
を設定しようとしています

しかし、confirmed_atは少なくとも私のpostegresqlデータベースでdatetimeデータ型を持っているので、これは使用しているデータベースに依存するかもしれません。

user.confirmed_at 
=> Sun, 05 Mar 2017 15:05:03 UTC +00:00 

だからあなたは、互換性のあるフォーマット/変数を使用するDateTimeクラスを検索してみてくださいUser.confirmed_at形式があり、これはあるものの

confirmed_at: datetime 

は、これはTime.now形式

pry(main)> Time.now 
=> 2017-03-14 11:14:06 +0100 

ですUTCを含む互換フォーマットの場合は、DateTime.nowが返されます。

[40] pry(main)> DateTime.now 
=> Tue, 14 Mar 2017 11:19:25 +0100 

DateTimeは、utc()の方法を有する。私がこれを実行すると、ほとんど必要なものになります。

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc 

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc 
=> 2005-02-21 16:11:12 UTC 

のDateTime APIをチェックして、githubの上のUTC()メソッド

DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24))  # => Mon, 21 Feb 2005 10:11:12 -0600 
DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utC# => Mon, 21 Feb 2005 16:11:12 UTC 


# File activesupport/lib/active_support/core_ext/date_time/calculations.rb, line 168 
def utc 
    utc = new_offset(0) 

    Time.utc(
    utc.year, utc.month, utc.day, 
    utc.hour, utc.min, utc.sec + utc.sec_fraction 
) 
end 

http://api.rubyonrails.org/classes/DateTime.html#method-i-utc

+0

これは正しい軌跡だと思うけど、dateTime.nowは私にとってはうまくいきませんでした。 DBはデフォルトのSQLite設定です。私がこれを読んだら、Deviseのドキュメントで[SQLiteは日付を取るべきです](https://github.com/plataformatec/devise/wiki/How-To:-Add-:confirmable-to-Users)が見つかりました。私はこの構文を試しましたが、運はありません。 – oneWorkingHeadphone

+0

@oneWorkingHeadphoneユーザ「.skipconfirmation!」を考案する方法があります。 'user = User.new'でユーザを作成すると、' user.skip_confirmation! 'と呼ばれ、次に –

+0

を保存します。これにより、ユーザデータがフィクスチャから取り出されることはありませんか? – oneWorkingHeadphone

関連する問題