Тестирование вложенных ресурсов RSpec - PullRequest
1 голос
/ 28 марта 2010

У меня есть две модели:

class Solution < ActiveRecord::Base
  belongs_to :owner, :class_name => "User", :foreign_key => :user_id
end                  

class User < ActiveRecord::Base
  has_many :solutions
end

со следующей маршрутизацией:

map.resources :users, :has_many => :solutions

и вот SolutionsController:

class SolutionsController < ApplicationController
  before_filter :load_user

  def index
    @solutions = @user.solutions
  end

  private
    def load_user
      @user = User.find(params[:user_id]) unless params[:user_id].nil?
    end
end

Кто-нибудь может мне помочь с написанием теста для действия index? До сих пор я пробовал следующее, но это не работает:

describe SolutionsController do
  before(:each) do
    @user = Factory.create(:user)
    @solutions = 7.times{Factory.build(:solution, :owner => @user)}
    @user.stub!(:solutions).and_return(@solutions)
  end

  it "should find all of the solutions owned by a user" do
    @user.should_receive(:solutions)
    get :index, :user_id => @user.id
  end
end

И я получаю следующую ошибку:

Spec::Mocks::MockExpectationError in 'SolutionsController GET index, when the user owns the software he is viewing should find all of the solutions owned by a user'
#<User:0x000000041c53e0> expected :solutions with (any args) once, but received it 0 times

Заранее спасибо за помощь.

Джо

EDIT:

Спасибо за ответ, я принял его, так как он получил мое намного дальше, за исключением того, что я получаю еще одну ошибку, и я не могу понять, что он пытается сказать мне:

Как только я создаю решения, а не собираю их, и добавляю заглушку User.find, я вижу следующую ошибку:

NoMethodError in 'SolutionsController GET index, when the user owns the software he is viewing should find all of the solutions owned by a user'
undefined method `find' for #<Class:0x000000027e3668>    

Ответы [ 2 ]

2 голосов
/ 28 марта 2010

Это потому, что вы строите решение, а не создаете. Значит, нет в вашей базе данных.

Сделано

  before(:each) do
    @user = Factory.create(:user)
    @solutions = 7.times{Factory.create(:solution, :owner => @user)}
    @user.stub!(:solutions).and_return(@solutions)
  end

И вы высмеиваете экземпляр пользователя, но есть другой экземпляр пользователя, который может быть создан Вам нужно добавить макет User.find тоже

  before(:each) do
    @user = Factory.create(:user)
    @solutions = 7.times{Factory.create(:solution, :owner => @user)}
    User.stub!(:find).with(@user.id).and_return(@user)
    @user.stub!(:solutions).and_return(@solutions)
  end
0 голосов
/ 29 марта 2010

Я понял, что моя правка: когда поиск выполняется по параметрам, они являются строками, а не действительными объектами или целыми числами, поэтому вместо:

User.stub!(:find).with(@user.id).and_return(@user)

Мне нужно

User.stub!(:find).with(@user.id.to_s).and_return(@user)

но спасибо тебе большое, шингара, ты меня направил в правильном направлении!

Джо

...