The*_*ppe 0 rspec ruby-on-rails shoulda ruby-on-rails-4
我一直在努力奋斗几个小时,我无法在任何地方找到答案.
基本上我正在使用shoulda为我的模型编写规范,并且由于某种原因即使我的let工作正常并且实际应用程序工作正常(手动确认并使用请求规范),如果我包括:
it { expect(user).to validate_uniqueness_of :email }
Run Code Online (Sandbox Code Playgroud)
在我的describe块中,我将收到以下错误:
1) User attributes should require case sensitive unique value for email
Failure/Error: it { expect(user).to validate_uniqueness_of :email }
RuntimeError:
Password digest missing on new record
# ./spec/models/user_spec.rb:14:in `block (3 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)
我已经到了解决这个规范的问题让我退缩,这从来都不是一件好事,因为实施已经有效.
如果有人可以帮助我在这里会很棒,因为我真的不想开始跳过那些因为某些模糊的原因而失败的测试.
我觉得好像rspec'忽略'调用has_secure_password来保存摘要的before方法,但我不确定.我只是假设,因为如果请求规范工作正常,这是做我不知道的事情.
我正在使用rails 4.0.0
以下是相关的代码.我感谢任何帮助.谢谢
user_spec.rb
require 'spec_helper'
describe User do
let(:user) {
user = User.new(:email => 'example@example.com',
:username => 'theo',
:password => 'secretpass',
:password_confirmation => 'secretpass')}
describe "attributes" do
it { expect(user).to validate_presence_of :email }
it { expect(user).to validate_uniqueness_of :email }
it { expect(user).to validate_presence_of :username }
it { expect(user).to validate_uniqueness_of :username }
it "saves are saved" do
user.save!
expect(user).to be_valid
end
end
end
Run Code Online (Sandbox Code Playgroud)
user.rb
class User < ActiveRecord::Base
has_secure_password
validates :email, :username, presence: true, uniqueness: true
validates :password, presence: true, :on => :create
end
Run Code Online (Sandbox Code Playgroud)
users_controller.rb
class UsersController < ApplicationController
def index
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to root_path, :notice => 'You have successfully signed up.'
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:email, :username, :password, :password_confirmation)
end
end
Run Code Online (Sandbox Code Playgroud)
请确保您的用户架构中存在password_digest,详情请见此处
create_table “users”, force: true do |t|
……
t.text “password_digest”
…..
end
Run Code Online (Sandbox Code Playgroud)
如果它在您的开发中有效而不是测试,请检查您是否在测试环境中执行rake db:migration,我的意思是RAILS_ENV = test rake db:migrate.
!!!更新 - 与shouda-matchersgocha 有关
这似乎是一个错误shoulda-matchers,因为当你这样做时,测试将通过:
it "should be validate uniq of email " do
user.save
expect(user).to validate_uniqueness_of :email
end
Run Code Online (Sandbox Code Playgroud)
我之所以这样做user.save是因为这样
,否则会为你创建一条记录,这会导致你得到的错误:
# https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_uniqueness_of_matcher.rb#L126
def create_record_in_database(options = {})
if options[:nil_value]
value = nil
else
value = "arbitrary_string"
end
@subject.class.new.tap do |instance|
instance.send("#{@attribute}=", value)
instance.save(:validate => false) # the error happens here, not in your code
end
end
Run Code Online (Sandbox Code Playgroud)
所以最重要的是,这可能是一个错误shouda-matchers,虽然我没有时间弄清楚如何修复它,现在你可以使用这个方法作为解决方法,或者使用其他方法来测试它.
希望能帮助到你 :-)
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |