RSpec, блокируя вложенные методы ресурса

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

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

class User < ActiveRecord::Base
  has_many :solutions
end

и я вкладываю решения в пользователях как это:

ActionController::Routing::Routes.draw do |map|
  map.resources :users, :has_many => :solutions
end

и наконец вот действие I "m пробующий к спецификации:

class SolutionsController < ApplicationController
  before_filter :load_user

  def show
    if(@user)
      @solution = @user.solutions.find(params[:id])
    else
      @solution = Solution.find(params[:id])
    end
  end

  private

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

Мой вопрос, как, черт возьми, делают меня Спецификация @user.solutions.find(params[:id])?

Вот моя текущая спецификация:

describe SolutionsController do

  before(:each) do
    @user = Factory.create(:user)
    @solution = Factory.create(:solution)
  end

  describe "GET Show," do

    before(:each) do
      Solution.stub!(:find).with(@solution.id.to_s).and_return(@solution)
      User.stub!(:find).with(@user.id.to_s).and_return(@user)
    end

    context "when looking at a solution through a user's profile" do

      it "should find the specified solution" do
        Solution.should_receive(:find).with(@solution.id.to_s).and_return(@solution)
        get :show, :user_id => @user.id, :id => @solution.id
      end
    end
  end

Но это получает меня следующая ошибка:

1)Spec::Mocks::MockExpectationError in 'SolutionsController GET Show, when looking at a solution through a user's profile should find the specified solution'
<Solution(id: integer, title: string, created_at: datetime, updated_at: datetime, software_file_name: string, software_content_type: string, software_file_size: string, language: string, price: string, software_updated_at: datetime, description: text, user_id: integer) (class)> received :find with unexpected arguments 
  expected: ("6")
  got: ("6", {:group=>nil, :having=>nil, :limit=>nil, :offset=>nil, :joins=>nil, :include=>nil, :select=>nil, :readonly=>nil, :conditions=>"\"solutions\".user_id = 34"})

Может кто-либо помогать мне с тем, как я могу заблокировать @user.solutions.new(params[:id])?

12
задан meagar 12 June 2012 в 17:42
поделиться

1 ответ

Похоже, что я нашел свой собственный ответ, но я собираюсь опубликовать его здесь, поскольку я не могу найти много информации об этом в сети.

В RSpec есть метод под названием stub_chain: http://apidock.com/rspec/Spec/Mocks/Methods/stub_chain

который позволяет легко заглушить метод, например:

@solution = @user.solutions.find(params[:id])

сделав следующее:

@user.stub_chain(:solutions, :find).with(@solution.id.to_s).and_return(@solution)

И тогда я могу написать RSpec тест вот так:

it "should find the specified solution" do
  @user.solutions.should_receive(:find).with(@solution.id.to_s).and_return(@solution)
  get :show, :user_id => @user.id, :id => @solution.id
end

И моя спецификация проходит. Однако, я все еще учусь, поэтому если кто-то считает, что мое решение не подходит, пожалуйста, не стесняйтесь комментировать это, и я постараюсь сделать все правильно.

Joe

25
ответ дан 2 December 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: