"undefined method `deleted_at=' for #<Spree::User",即使此列存在

"undefined method `deleted_at=' for #<Spree::User", even though this column exists

当我在测试中执行 create(:user) 时,出现此错误:undefined method deleted_at=' for #<Spree::User。 它发生在我所有试图做 create(:user).

的测试中

这是当我抛出一个 byebug 时发生的事情:

$ rspec ./spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb:40

  1) Spree::PermissionSets::RestrictedStockTransferDisplay when not activated
     Failure/Error: let(:user) { create :user }
     ActiveRecord::StatementInvalid:
       PG::UndefinedColumn: ERROR:  column spree_users.deleted_at does not exist
       LINE 1: ..."spree_users"."email" = 'darby@tremblay.name' AND "spree_use...
                                                                    ^
       : SELECT  1 AS one FROM "spree_users" WHERE ("spree_users"."email" = 'darby@tremblay.name' AND "spree_users"."deleted_at" IS NULL) LIMIT 1

user_factory.rb

require 'spree/testing_support/sequences'
require 'spree/testing_support/factories/role_factory'
require 'spree/testing_support/factories/address_factory'

FactoryGirl.define do

  factory :user, class: Spree.user_class do
    email { generate(:random_email) }
    login { email }
    password 'secret'
    password_confirmation { password }
    authentication_token { generate(:user_authentication_token) } if Spree.user_class.attribute_method? :authentication_token


     # [cut...]    

  end
end

deleted_at 存在于数据库中

$ psql Solidus_test
psql (9.4.5)

Solidus_test=# \d spree_users

Table "public.spree_users"
             Column         |            Type             |                        Modifiers
    ------------------------+-----------------------------+----------------------------------------------------------

     deleted_at             | timestamp without time zone |

但 Spree::User 中不存在。column_names

如果我在 create(:user) 之前的测试中输入 byebug,我会发现:

(byebug) Spree::User.column_names

["id", "encrypted_password", .....]

^ 否 "deleted_at"

关于如何滚动的任何提示?为什么我使用 psql 可以看到 'deleted_at' 而使用 Spree::User.column_names 时却看不到?

是的,我正在连接 Solidus_test:

$ grep 'test'  config/database.yml -A2
test:
  <<: *default
  database: Solidus_test

检查 rspec 循环外的测试环境显示 deleted_at 存在:

✗ RAILS_ENV=test r c
Running via Spring preloader in process 4092
Loading test environment (Rails 4.2.5)
irb: warn: can't alias context from irb_context.
2.2.3 :001 > Spree::User.column_names
 => ["id", "encrypted_password", "password_salt", "email", "remember_token", "persistence_token", 
"reset_password_token", "perishable_token", "sign_in_count", "failed_attempts", "last_request_at", 
"current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "login", 
"ship_address_id", "bill_address_id", "authentication_token", "unlock_token", "locked_at", 
"reset_password_sent_at", "created_at", "updated_at", "spree_api_key", "remember_created_at", 
"deleted_at", "confirmation_token", "confirmed_at", "confirmation_sent_at"]

我从固相线 gem 复制 spec/spec_helper 时忘记更新了一些东西。

我通过加载正确的环境修复了 spree_users.deleted_at 错误:

require File.expand_path("../dummy/config/environment", __FILE__) 22 

应该是:

require File.expand_path("../../config/environment", __FILE__)

谢谢大家的建议! :-D