我有带有验证的用户设计模型
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates :first_name, presence: true, length: { maximum: 100 }
validates :last_name, presence: true, length: { maximum: 100 }
validates :email, presence: true, uniqueness: true, format: { with: /\A.+@.+\..+\z/ }
end
和RSpec文件来测试电子邮件验证
describe 'email field' do
subject { User.new(first_name: 'jan', last_name: 'kowalski', email: 'jan@foo.com').valid? }
context 'when email has wrong format' do
let(:email) { 'jan@foo' }
it 'complains for invalid format' do
is_expected.to eq false
end
let(:email) { 'jan' }
it 'complains for invalid format' do
is_expected.to eq false
end
end
context 'when email has correct format' do
it 'accepts valid format' do
is_expected.to eq true
end
end
end
我想测试用户模型中正确的电子邮件地址格式的验证。除最后一次出现错误expected: true got: false
以外,所有测试均顺利通过。我是否错过了规范文件中的某些内容?还是我在用户模型中有错误的声明?欢迎任何帮助。
答案 0 :(得分:1)
您的规范文件中有一些错误,无论如何,两封电子邮件始终无法执行。
如果您想要这种行为,则需要用一个变量替换主题中的email选项,第二秒钟将其包装在上下文中并放入let(:email)内,这就是rspec的方式将替换每个主题中的主题值。
这里有一个示例,但是使用了一个password变量,您的两个第一个测试也通过了,因为您缺少密码,以至于expec为false,但是他们没有测试您正在描述的测试。
describe 'password field' do
subject { Usuario.new(nombre: 'jan', username: 'kowalski', password: password).valid? }
context 'when password has wrong format' do
let(:password) { nil }
it 'complains for invalid format' do
is_expected.to eq false
end
end
context 'when password size is incorrect' do
let(:password) { 'jan' }
it 'complains for invalid format' do
is_expected.to eq false
end
end
context 'when password has correct format' do
let(:password) { '1qaz2wsx' }
it 'accepts valid format' do
is_expected.to eq true
end
end
end