Rails ActiveRecord模型未在RSpec模型规范中更新

sgbett

这让我发疯。我在不丢失上下文的情况下将其降至最低限度(我认为!)

我要做的只是检查更新值并将其保存到数据库时,该值是否已保存。我想这样做是因为我需要编写其他代码来有条件地防止在before_save回调中执行此操作,并且在确定运行正常之前,我无法对其进行测试!

工厂和规格都在下面,我敢肯定它确实很愚蠢,但我只是想不通...

FactoryGirl.define do

  factory :programme do
    name 'Trainee Programme'
  end

  factory :membership do
    programme
  end

  factory :specialty do
    sequence(:name) { |n| "Specialty #{n}" }
  end

  factory :user do
    sequence(:email) { |n| "factorygirl-user-#{n}@remailer.org" }
    password 'password'
    password_confirmation 'password'
    factory :trainee, class: User do
      sequence(:email) { |n| "factorygirl-trainee-#{n}@remailer.org" }
      name 'Factory Girl Trainee'
      after(:create) do |user|
        FactoryGirl.create(:membership, user: user, start_date: 1.day.ago)
      end
    end
  end

end

describe Membership do

  let(:trainee) { FactoryGirl.create(:trainee) }

  it 'sets specialty' do
    puts trainee.current_membership.inspect
    trainee.current_membership.specialty = specialty
    puts trainee.current_membership.inspect
    trainee.current_membership.save!
    puts trainee.current_membership.inspect
    expect(trainee.current_membership.specialty).to eq(specialty)      
  end

end

规格失败,因为期望值显示为零。当我运行代码时,我得到的调试输出是:

#<Membership id: 11, user_id: 11, programme_id: 11, start_date: "2015-03-10", end_date: nil, created_at: "2015-03-11 22:02:51", updated_at: "2015-03-11 22:02:51", options: {}, specialty_id: nil, membership_type_id: nil>
#<Membership id: 11, user_id: 11, programme_id: 11, start_date: "2015-03-10", end_date: nil, created_at: "2015-03-11 22:02:51", updated_at: "2015-03-11 22:02:51", options: {}, specialty_id: nil, membership_type_id: nil>
#<Membership id: 11, user_id: 11, programme_id: 11, start_date: "2015-03-10", end_date: nil, created_at: "2015-03-11 22:02:51", updated_at: "2015-03-11 22:02:51", options: {}, specialty_id: nil, membership_type_id: nil>

好像专业分配从未发生过??

sgbett

感谢BroiState和Mori给我一些指示,我得以确定它与持久性有关(特别是我的一种不尊重持久性的对象方法!)

trainee.current_membership的代码如下:

def current_membership
  return unless memberships.current.any?
  memberships.current.first
end

在会员中使用这些相关范围...

scope :started, -> { self.where("#{table_name}.#{_start_field}::TIMESTAMP < '#{Time.now}'") }
scope :not_ended, -> { self.where("#{table_name}.#{_end_field} IS NULL OR #{table_name}.#{_end_field}::TIMESTAMP > '#{Time.now}'") }
scope :current, -> { self.started.not_ended }

因此,每次对trainee.current_membership的调用都给了我“当前”会员记录的新实例

通过显式使用相同的对象,规范可以很好地通过,即:

it 'sets specialty' do
  membership = trainee.current_membership
  membership.specialty = specialty
  membership.save!
  expect(membership.specialty).to eq(specialty.reload)      
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails ActiveRecord模型未在RSpec模型规范中更新

来自分类Dev

最终用户更新Rails ActiveRecord模型中的枚举

来自分类Dev

模型上的Rails rspec测试更新属性

来自分类Dev

模型上的Rails rspec测试更新属性

来自分类Dev

在Rails 4中更新模型

来自分类Dev

Rails从ActiveRecord :: Relation查询中删除模型

来自分类Dev

在Ruby on Rails中查看ActiveRecord模型字段

来自分类Dev

Rails防止更新模型中的某些值

来自分类Dev

在Rails中定期更新模型(时间间隔)

来自分类Dev

如何在Ruby on Rails / ActiveRecord中克隆模型?

来自分类Dev

Rails模型继承中的“ ActiveRecord :: StatementInvalid:找不到表”

来自分类Dev

如何在Rails中存根非ActiveRecord模型?

来自分类Dev

如何使用Rspec在Rails中测试模型默认值

来自分类Dev

如何使用rspec在Rails模型中测试特定线

来自分类Dev

使用带有Rspec的Rails在模型中测试验证

来自分类Dev

Ruby on Rails模型中的<<

来自分类Dev

Rails模型中的自用

来自分类Dev

在Rails中缓存模型

来自分类Dev

由于未在模型中定义,Rails如何解析模型属性?

来自分类Dev

在Rails中转换ActiveRecord模型属性

来自分类Dev

Ruby on Rails:Activerecord集合关联的模型

来自分类Dev

Rails 4,rspec 3:模型验证测试

来自分类Dev

RSpec看不到Rails模型

来自分类Dev

Rails:RSpec未能通过模型子类的验证

来自分类Dev

测试指向自身 rspec rails 5 的模型

来自分类Dev

Rails:从 Rails Migration 中的模型调用方法

来自分类Dev

Rails-在创建时更新模型中的布尔属性

来自分类Dev

Ruby on Rails跳过模型中特定方法的更新回调

来自分类Dev

Rails更新方法中的相关模型数据

Related 相关文章

热门标签

归档