【问题标题】:wrong mock_model in rspecrspec 中的 mock_model 错误
【发布时间】:2011-10-24 19:09:53
【问题描述】:

这是在控制器中创建的 rspec 代码:

describe "'create' successful" do
  before(:each) do

    @customer = mock_model(Customer)
    @customer.stub(:save).and_return(true) 

    session[:sales] =  true
    session[:user_id] = 1
    session[:user_name] = "sales.name"
    session[:page_step] = 1
    session['page1'] = customers_path
  end

  it "should create one customer record" do
    lambda do
      put 'create', @customer         
    end.should change(Customer, :count).by(1)
  end

  it "should redirect to customers path" do
    put 'create', @customer
    flash[:notice].should_not be_nil
    response.should redirect_to(customers_path)
  end
end

这是在控制器中创建:

  def create

    if session[:sales]
      @customer = Customer.new(params[:customer], :as => :roles_new_update)
      @customer.sales_id = session[:user_id]
      if @customer.save
        @message = "New customer #{params[:name]} was created. Please check it out"
        @subject = "New customer #{params[:name]} was created BY {#session[:user_name]}"
        UserMailer.notify_tl_dh_ch_ceo(@message, @subject, session[:user_id])
        redirect_to session[('page' + session[:page_step].to_s).to_sym], :notice => 'Customer was created successfaully!'          
      else
        render 'new', :notice => 'Customer was not saved!'
      end
    end
  end

这是 rspec 中的错误:

  1) CustomersController GET customer page 'create' successful should create one customer record
     Failure/Error: put 'create', @customer
     NoMethodError:
       undefined method `symbolize_keys' for "1001":String
     # ./spec/controllers/customers_controller_spec.rb:40:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/customers_controller_spec.rb:39:in `block (4 levels) in <top (required)>'

  2) CustomersController GET customer page 'create' successful should redirect to customers path
     Failure/Error: put 'create', @customer
     NoMethodError:
       undefined method `symbolize_keys' for "1002":String
     # ./spec/controllers/customers_controller_spec.rb:45:i

问题在于@customer 的模拟数据。规范中的嘲笑有什么问题?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 rspec2


    【解决方案1】:

    没有错,您只需让模型获取您创建的模拟。

    继续往下:

    @customer = mock_model(Customer)
    @customer.stub(:save).and_return(true) 
    Customer.should_receive(:new).and_return(@customer)
    

    重读您的问题,我发现 Rails 可能会抱怨,因为当您将变量传递给路由时,它应该响应 to_param

    但你的模拟没有:它什么都不是。

    我会说从以下选项中进行选择:

    • 使用具有正确属性的真实 ActiveRecord 对象的 Factory

    • put 'create', 1234 或您想要的任何整数编辑您的测试。

    顺便说一句,put 触发了 update 操作,该操作不应该创建对象而只是更改它们。

    【讨论】:

    • 添加了 Customer.should_receive(:new).and_return(@customer) 如上所述。同样的错误。
    • 在 post 中尝试了以下操作,它是相同的错误: Customer.should_receive(:new).with({:name => 'test one', :short_name => 'test', :contact => 'guy', :cell => '123', :phone => '456', :address => '有线地址', :active => true, :category1_id => 1, :sales_id => 2, :电子邮件 => 'test@wx.com' }).and_return(@customer)
    • 尝试使用 Factory 获取真实数据。不知何故,@customer.save 没有返回 True,因此 lambda 没有执行并导致规范失败。我在stackoverflow.com/questions/7867361/… 上发布了一个问题。请看一下工厂是否有任何问题。谢谢。
    • 您是否将put 替换为post
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多