我关注ruby.railstutorial.org。我遇到了一些麻烦,但我解决了。然而,现在,我正在谷歌搜索相当一段时间,检查代码,我甚至知道为什么测试失败,但不知道如何让它通过。
所以,这就是问题所在。我有一个用户模型:
class User < ActiveRecord::Base
attr_accessible :email, :name
validates :name, presence: true, length: {maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
end
问题与不区分大小写的唯一性检查有关。 Rspec 中的测试是:
before { @user = User.new(name: "Example User", email: "user@example.com") }
subject { @user }
describe "when email address is already in use" do
before do
user_with_same_email = @user.dup
user_with_same_email = @user.email.upcase
user_with_same_email.save
end
it { should_not be_valid }
end
测试错误消息如下:
Failures:
1) User when email address is already in use
Failure/Error: user_with_same_email.save
NoMethodError:
undefined method `save' for "USER@EXAMPLE.COM":String
# ./spec/models/user_spec.rb:53:in `block (3 levels) in <top (required)>'
因此模型甚至无法保存。我不知道该怎么做。但是,如果我们从测试中注释掉以下行:
user_with_same_email = @user.email.upcase
并从模型代码中删除 {case_sensitive:false} 部分,测试过程。 我希望测试做的是实际保存 user_with_same_email 变量,然后报告无效。 任何帮助/链接/建议都非常感谢。
答案 0 :(得分:2)
此行确实有问题
user_with_same_email = @user.email.upcase
user_with_same_email
是一个对象,您需要设置电子邮件attr而不是对象本身。
user_with_same_email.email = @user.email.upcase
答案 1 :(得分:0)
说user_with_same_email是一个字符串,没有保存方法。
猜猜,我想你需要用这个电子邮件创建一个用户对象,这样你就可以测试你的代码找到它并抛出验证。
答案 2 :(得分:0)
我自己在指令中被这个错误简单地拖了过来。一般情况下,如果遇到任何类似问题,我建议您访问the tutorial的帮助部分。如果此处未涵盖该问题,您可以查看指向github的Official Sample Code
链接。该问题的代码在该存储库中是正确的。欢呼声。