我的理解是Rails的测试环境在每次测试之前被拆除并重建......所以我如何测试需要用户登录的控制器,如果没有Device的可确认模块获取,则无法创建用户在路上?
Devise的recommended method(下面)创建了一个新用户,然后由Devise的confirmable
模块发送一封电子邮件。我如何解决这个问题,所以我不是每次都“创造”一个用户...或者如果我是,我可以得到一个对象来测试每个规范的“模拟”新电子邮件?
before(:each) do
@user = Factory.create(:user)
sign_in @user
end
我确信我忽略了一些非常明显的东西,因为对于任何使用Devise并且可以确认的人来说这一定是一个非常常见的规范......
答案 0 :(得分:34)
在您的测试环境中,ActionMailer::Base.delivery_method
应设置为:test
,这意味着这些电子邮件不会被发送出去。如果通过smtp
中的配置将此设置设置为其他内容,例如config/environments.rb
,则会发送 电子邮件。
如果该设置已经存在,那么要使用User
对象(例如,实际上可以登录),您需要在其上调用confirm!
:
user = User.first
user.confirm!
答案 1 :(得分:17)
获取最新的FactoryGirl版本:
FactoryGirl.define do
factory :confirmed_user, :parent => :user do
after(:create) { |user| user.confirm! }
end
end
答案 2 :(得分:13)
如果您使用factory_girl生成模型,则可以使用after_create
确认每个新用户。
Factory.define :confirmed_user, :parent => :user do |f|
f.after_create { |user| user.confirm! }
end
答案 3 :(得分:6)
今天刚刚提出来:
confirmed_at 7.days.ago
关于你的捏造
答案 4 :(得分:5)
对于Devise 4.2,现在@echo off
setlocal EnableDelayedExpansion
:: Reset file
Type Nul >OnlineServers.txt
for /F "delims=" %%a in (servers.txt) do (
ping -n 1 "%%a" >NUL 2>&1
If !errorlevel! equ 0 (
echo %%a Online
echo %%a Online>>OnlineServers.txt
) Else (
echo %%a Offline
)
)
(不是confirm
)。
4.2.0 - 2016-07-01
删除Devise :: Models :: Confirmable#confirm!方法,改为使用确认。
以下代码还可以防止通过confirm!
与after(:build)
设置after(:create)
来生成邮件程序
confirmed_at
答案 5 :(得分:2)
尝试存根active?
@user = Factory.create(:user)
@user.stub(:active?).and_return(true)
sign_in @user
您可能还需要存根confirmed?
,我对Devise不太熟悉。
答案 6 :(得分:2)
这个线程已经有一段时间没有看到太多流量了,但是对于现在有这个问题的人来说,您需要做的就是创建一个名为 :confirmed
的 trait 来设置所需的属性,并在您使用它时要创建用户,您将能够使用该用户登录,而无需多次保存用户数据库记录。
# Use faker library (installed separately) to set realistic seed data
require 'faker'
# Factory definition
factory :user, do
email { Faker::Internet.unique.email }
password { Faker::Internet.password(min_length: 12, max_length: 128) }
trait :confirmed do
confirmed_at { Time.zone.now }
confirmation_sent_at { Time.zone.now }
confirmation_token { '12345' }
end
end
# Example of using it
user = create(:user, :confirmed)
答案 7 :(得分:1)
制作宝石是
Fabricator(:user) do
after_build { |user| user.confirm! }
end