The*_*hop 12 bdd unit-testing rspec ruby-on-rails nested-resources
我有两个型号:
class Solution < ActiveRecord::Base
belongs_to :owner, :class_name => "User", :foreign_key => :user_id
end
class User < ActiveRecord::Base
has_many :solutions
end
Run Code Online (Sandbox Code Playgroud)
我在这样的用户中嵌套解决方案:
ActionController::Routing::Routes.draw do |map|
map.resources :users, :has_many => :solutions
end
Run Code Online (Sandbox Code Playgroud)
最后这是我试图规范的行动:
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
Run Code Online (Sandbox Code Playgroud)
我的问题是,我怎么样@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
Run Code Online (Sandbox Code Playgroud)
但这给我带来了以下错误:
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"})
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我如何存根@user.solutions.new(params[:id])?
The*_*hop 25
看起来我找到了自己的答案,但我会在这里发布,因为我似乎无法在网上找到很多这方面的内容.
RSpec有一个名为stub_chain的方法:http://apidock.com/rspec/Spec/Mocks/Methods/stub_chain
这样可以很容易地存储一个方法:
@solution = @user.solutions.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
通过做这个:
@user.stub_chain(:solutions, :find).with(@solution.id.to_s).and_return(@solution)
Run Code Online (Sandbox Code Playgroud)
那么我可以像这样写一个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
Run Code Online (Sandbox Code Playgroud)
我的规格通过了.但是,我还在这里学习,所以如果有人认为我的解决方案不好,请随意评论这一点,我试着让它完全正确.
乔
Den*_*nis 12
使用新的RSpec语法,您可以像这样存根链
allow(@user).to receive_message_chain(:solutions, :find)
# or
allow_any_instance_of(User).to receive_message_chain(:solutions, :find)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7022 次 |
| 最近记录: |