【发布时间】:2016-07-12 02:07:17
【问题描述】:
Rails 5 现已推出,我正在升级我的基本登录/CRUD 应用程序以使用新框架,其中还涉及将 Devise 更新到 4.2。事情很简单,除了一个失败的rspec 测试。我尝试使用pry 单步执行代码,但发现问题超出了我的范围。任何指针将不胜感激。
这是错误:
Failures:
1) User email rejects email addresses with improper format
Failure/Error: expect(user).not_to be_valid
ArgumentError:
wrong number of arguments (given 0, expected 1)
# ./spec/models/problem_test_user_spec.rb:13:in `block (4 levels) in <top (required)>'
# ./spec/models/problem_test_user_spec.rb:11:in `each'
# ./spec/models/problem_test_user_spec.rb:11:in `block (3 levels) in <top (required)>'
这里是精简的测试:
1 require 'rails_helper'
2 require 'devise'
3
4 RSpec.describe User, type: :model do
5 let (:user) { FactoryGirl.create :user }
6
7 describe "email" do
8 it "rejects email addresses with improper format" do
9 invalid_addresses = %w[ user@example,com user_at_foo.org user.name@example. ]
10
11 invalid_addresses.each do |addr|
12 user.email = addr
13 expect(user).not_to be_valid
14 end
15 end
16 end
17 end
这是我的模型:
class User < ApplicationRecord
devise :database_authenticatable, :validatable
validates :email, length: { maximum: 254 } # max length per RFC 3696, errata ID 1690
end
这是我的工厂:
FactoryGirl.define do
factory :user do
name { Faker::Name.name }
tone_name { "#{Faker::Company.name} Tone" }
email { Faker::Internet.email }
password SOME_PASSWORD
password_confirmation SOME_PASSWORD
admin false
end
end
附言:该应用程序在我的开发环境中运行良好,但它允许name@example,com 形式的无效密码,其中rails 4.2 版本通过rspec 测试并捕获此无效密码并出现错误。
另一个线索:我了解到 Devise 在 v4.1 中将默认 email_regexp 更改为不那么严格的表达式。我的测试实际上失败了,因为以前被识别为非法的电子邮件地址现在被接受了。 ArgumentError 不在我的代码中。我相信这是 Devise 或 Rspec 中的错误。如果我在测试中添加binding.pry,那么在我的模型上添加一个简单的#inspect 会导致以下结果:
12: invalid_addresses.each do |addr|
13: user.email = addr
14: binding.pry
=> 15: expect(user).not_to be_valid
16: end
17: end
18: end
19: end
[1] pry(#<RSpec::ExampleGroups::User::Email>)> user.inspect
ArgumentError: wrong number of arguments (given 0, expected 1)
from /Users/tarsa/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise-4.2.0/lib/devise/models/database_authenticatable.rb:146:in `password_digest'
Devise 代码看起来没有问题,我怀疑正在与 ActiveRecord 进行一些交互,但此时我的调试技能已达到极限。
我可以通过将 Devise 配置为使用 4.0.3 版本的 email_regexp 来解决此问题。如果所有密码字符串都被识别为无效,那么无论它在哪里,这个 bug 都不会被触发。
【问题讨论】:
-
你的工厂定义是什么?
-
添加了工厂定义。
-
我注意到你的用户类仍然继承自
ActiveRecord::Base,你是否创建了新的超类(see guide)?然后用户将继承为User < ApplicationRecord。 -
@Huw,谢谢!我在转换中错过了这一点,但它没有效果。我确实发现了潜在的线索,也解决了测试问题,但没有找到根本原因。我已经更新了我的问题以反映这一点。
标签: ruby-on-rails rspec rspec-rails ruby-on-rails-5