Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Mongoid Model.find在规范中失败,但在应用程序中有效_Ruby On Rails_Ruby_Rspec_Mongoid_Bson - Fatal编程技术网

Ruby on rails Mongoid Model.find在规范中失败,但在应用程序中有效

Ruby on rails Mongoid Model.find在规范中失败,但在应用程序中有效,ruby-on-rails,ruby,rspec,mongoid,bson,Ruby On Rails,Ruby,Rspec,Mongoid,Bson,下一行: User.find(session[:user_id]) 其中会话[:user\u id]先前定义: session[:user_id] = user.id In-spec工作正常并返回用户模型,但在real app(开发模式)中失败: MOPED: 127.0.0.1:27017 QUERY database=rails_api_development collection=users selector={"_id"=>{"$oid"=>BSON

下一行:

  User.find(session[:user_id])
其中
会话[:user\u id]
先前定义:

  session[:user_id] = user.id
In-spec工作正常并返回用户模型,但在real app(开发模式)中失败:

MOPED: 127.0.0.1:27017 QUERY        database=rails_api_development collection=users selector={"_id"=>{"$oid"=>BSON::ObjectId('533c3958616c641142010000')}} flags=[] limit=0 skip=0 batch_size=nil fields=nil runtime: 1.0680ms
Completed 500 Internal Server Error in 15ms

Moped::Errors::QueryFailure - The operation: #<Moped::Protocol::Query
    @length=89
@request_id=2
@response_to=0
@op_code=2004
@flags=[]
@full_collection_name="rails_api_development.users"
@skip=0
@limit=0
@selector={"_id"=>{"$oid"=>BSON::ObjectId('533c3958616c641142010000')}}
@fields=nil>
    failed with error 10068: "invalid operator: $oid"

See https://github.com/mongodb/mongo/blob/master/docs/errors.md
for details about this error.:
  moped (2.0.0.rc1) lib/moped/operation/read.rb:50:in `block in execute'
  moped (2.0.0.rc1) lib/moped/node.rb:594:in `block (2 levels) in flush'
但spec在以下方面失败:

   1) ApplicationController current_user when current_user is nil and user_id stores in session finds and returns it from db
 Failure/Error: expect(subject.send(:current_user)).to eq user
 NoMethodError:
   undefined method `[]' for BSON::ObjectId('533fae9e616c6464a4010000'):BSON::ObjectId
 # ./app/controllers/application_controller.rb:7:in `current_user'
 # ./spec/controllers/application_controller_spec.rb:22:in `block (5 levels) in <top (required)>'

我之前也遇到过类似的问题,问题是会话中
BSON::ObjectId
的json表示。正如您还发现的那样,给_s打电话解决了这个问题。您需要确保会话包含字符串格式的id。因此,每当您将用户id分配给会话时,请调用
。尝试进行以下更改:

ApplicationController
中的
当前用户=
更改为:

  User.find(session[:user_id]['$oid'])
def current_user=(user)
  @current_user = user
  session[:user_id] = user.try(:id).try(:to_s)
end
将等级库更改为:

context "and user_id stores in session" do
  let(:user) { create(:user) }
  before { allow(subject).to receive(:session).and_return({ user_id: user.id.to_s }) }
  before { allow(User).to receive(:find).and_return(user) }

  it "finds and returns it from db" do
    expect(User).to receive(:find)
    expect(subject.send(:current_user)).to eq user
  end
end

请在{allow(User).to receive(:find).and_return(User)}之前发布失败的相关测试,因此没有必要,并将预期更改为
expect(User).to receive(:find).and_return(User)
context "and user_id stores in session" do
  let(:user) { create(:user) }
  before { allow(subject).to receive(:session).and_return({ user_id: user.id.to_s }) }
  before { allow(User).to receive(:find).and_return(user) }

  it "finds and returns it from db" do
    expect(User).to receive(:find)
    expect(subject.send(:current_user)).to eq user
  end
end