Ruby on rails 为Mongoid嵌入式模型创建控制器测试

Ruby on rails 为Mongoid嵌入式模型创建控制器测试,ruby-on-rails,mongodb,rspec,mongoid,Ruby On Rails,Mongodb,Rspec,Mongoid,我正在开发一个Rails 3应用程序,它允许用户通过将电影添加到队列中来跟踪电影,以便在电影首映时通知他们 因为我使用的是Mongoid,所以我对它进行了结构化,这样当用户将电影添加到队列中时,他们会创建一个嵌入式文档,添加,并且他们还会将电影模型上的添加计数器增加1 我已经能够让我的规范通过,确认这种行为在模型级工作,但是现在我正在构建控制器,我似乎无法得到通过的响应。我一直在到处寻找解决方案,甚至在我睡了一觉之后,又回到了这个问题上,我仍然无法找出我做错了什么 这是我的控制器规格: # sp

我正在开发一个Rails 3应用程序,它允许用户通过将电影添加到队列中来跟踪电影,以便在电影首映时通知他们

因为我使用的是Mongoid,所以我对它进行了结构化,这样当用户将电影添加到队列中时,他们会创建一个嵌入式文档,
添加
,并且他们还会将
电影
模型上的
添加计数器
增加1

我已经能够让我的规范通过,确认这种行为在模型级工作,但是现在我正在构建控制器,我似乎无法得到通过的响应。我一直在到处寻找解决方案,甚至在我睡了一觉之后,又回到了这个问题上,我仍然无法找出我做错了什么

这是我的控制器规格:

# spec/controllers/adds_controller_spec.rb

require 'spec_helper'

describe AddsController do

  before(:each) do
    @user = Factory(:user)
    @movie = Factory(:movie)
  end

  describe '#create' do

    context 'given valid params' do

      before(:each) do
        sign_in @user
      end

      it "creates a new add" do
        add_count @user.adds.count
        post :create, :movie_id => @movie.id
        @user.adds.count.should == add_count + 1
      end

    end
  end
end
这是我的控制器:

# controllers/adds_controller.rb    

class AddsController < ApplicationController
  before_filter :authenticate_user!

  def create
    @movie = Movie.find(params[:movie_id])
    @user = current_user
    @user.add_to_queue!(@movie)

    respond_to do |format|
      format.js
    end
  end
end
最后,以下是我运行控制器测试时Rspec的反馈:

Failures:

  1) AddsController#create given valid params creates a new add
     Failure/Error: @user.adds.count.should == 1
       expected: 1
            got: 0 (using ==)
     # ./spec/controllers/adds_controller_spec.rb:25:in `block (4 levels) in <top (required)>'
故障:
1) AddsController#创建给定的有效参数创建新的add
失败/错误:@user.adds.count.should==1
预期:1
获取:0(使用==)
#./spec/controllers/adds_controller_spec.rb:25:in'block(4层)in'

此代码过于复杂。我会去掉Add类。添加的概念不应该由对象建模,而应该由关系建模

分为两类(简化):

movie.rb

class Movie
    include Mongoid::Document
    has_and_belongs_to_many :user_queues, :class_name => "User", :inverse_of => :movie_queue
end
class User
    include Mongoid::Document
    has_and_belongs_to_many :movie_queue, :class_name => "Movie", :inverse_of => :user_queues
end
user.rb

class Movie
    include Mongoid::Document
    has_and_belongs_to_many :user_queues, :class_name => "User", :inverse_of => :movie_queue
end
class User
    include Mongoid::Document
    has_and_belongs_to_many :movie_queue, :class_name => "Movie", :inverse_of => :user_queues
end

这里的语法可能不精确,但将它们视为数组,您将获得黄金。

谢谢。我做了这个改变,它大大加快了速度,但由于某些原因,我的控制器测试仍然不起作用。有没有想过为什么会这样?不确定,也许值得问问mongoid的人?听起来不错-我会接受你的回答,因为听起来问题可能更大。好吧,很抱歉我帮不了你Sean。我对Mongoid的测试部分不太熟悉。