2011-12-01 3 views
0

나는 사용자가 대기열에 동영상을 추가하여 영화를 관람할 수 있도록 영화를 초연 할 때 알림을받을 수있는 Rails 3 앱을 개발하고 있습니다. 사용자가 자신의 대기열에 동영상을 추가 할 때, 그들이 포함 된 문서, adds을 만들 수 있도록몽고이 내장 모델에 대한 컨트롤러 테스트를 만듭니다.

내가 Mongoid을 사용하고 있기 때문에, 나는 그것을 구성했다, 또한 1

하여 Movie 모델에 add_counter를 증가

이 동작이 모델 수준에서 작동하고 있음을 확인하는 데 필자의 사양을 전달할 수 있었지만 컨트롤러를 만들었으므로 지나가는 응답을 얻을 수없는 것 같습니다. 나는 해결책을 찾기 위해 사방을 찾고 있었고 심지어 잠자고 돌아와서도 내가 잘못하고있는 것을 알아 내지 못했습니다.

# 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 

그리고 여기 내 모델입니다 : 여기

# 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 

내 컨트롤러 : 여기

내 컨트롤러 사양입니다 마지막으로

# models/movie.rb 

class Movie 
include Mongoid::Document 
include Mongoid::Timestamps 
include Mongoid::MultiParameterAttributes 

field :add_counter, :type => Integer, :default => 0 

# models/user.rb 

class User 
include Mongoid::Document 
include Mongoid::Timestamps 
include Mongoid::MultiParameterAttributes 

embeds_many :adds 

def add_to_queue!(movie) 
    if already_added?(movie) == false 
    adds.create!(:movie_id => movie.id) 
    movie.add_counter += 1 
    end 
end 

def already_added?(movie) 
    adds.where(:movie_id => movie.id).exists? 
end 

# models/add.rb 

class Add 
include Mongoid::Document 
include Mongoid::Timestamps 
include Mongoid::MultiParameterAttributes 

field :movie_id, :type => String 
key :movie_id 

embedded_in :user 

, 여기 RSpec에의 피드백이 때 I 컨트롤러 테스트를 실행하십시오.

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

이 코드는 지나치게 복잡합니다. 나는 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 너는 황금색이 될거야.

+0

감사합니다. 나는이 변화를 만들었고 꽤 많은 일들이 일어 났지만 컨트롤러 테스트는 여전히 어떤 이유로 작동하지 않습니다. 그 이유에 대한 어떤 생각? –

+0

잘 모르겠지만 몽고 계인에게 물어볼 가치가있을 것 같습니까? –

+0

좋은 소리 - 문제가 더 커질 수있는 것처럼 들리므로 그동안 답변을 수락합니다. –

관련 문제