在Rspec中分配用法

时间:2017-09-26 04:07:28

标签: ruby-on-rails ruby rspec ruby-on-rails-5

我想问为什么在运行rspec控制器测试时我总是得到零值? 我已经阅读了这个网站和大多数答案,因为复数词使用内部分配 但在我的情况下,这不起作用,我仍然有相同的价值 这是我的控制器

  class ContactsController < ApplicationController
  load_and_authorize_resource
  before_action :find_contact, only: [:show,:edit,:update,:destroy]

  def index
    authorize! :index, Contact
    @contact = Contact.accessible_by(current_ability)
    # @contact = Contact.all
  end

  def show
  end

  def new
    @contact = Contact.new
  end

  def edit
  end

  def create
    @contact = current_user.contact.new(contact_params)

    if @contact.save
      redirect_to @contact
    else
      render 'new'
    end

  end

  def update
    # @contact = Contact.find(params[:id])
    if @contact.update(contact_params)
      redirect_to @contact
    else
      render 'edit'
    end

  end

  def destroy
    @contact.destroy

    redirect_to contacts_path
  end

  private

  def contact_params
    params.require(:contact).permit(:firstname,
                                    :lastname,
                                    :alamat,
                                    details_attributes: [:id, :number, :_destroy])
  end

  def find_contact
    @contact = Contact.find(params[:id])
  end
end

这是我简单的控制器测试

require 'rails_helper'

RSpec.describe ContactsController do

  describe "Contact"  do 

    it "succesfully create the contact" do
      contact = FactoryGirl.create(:contact)
      get :index
      # byebug
      expect(assigns(:contacts)).to eq([contact])
    end

  end

end

即使我将assigns(:contacts)更改为assigns(:contact),我仍然拥有相同的价值。那我在哪里做错了? 请好好回答这个,非常感谢

2 个答案:

答案 0 :(得分:1)

  

即使我将assigns(:contacts)更改为assigns(:contact)我仍然得到了   相同的价值。那我在哪里做错了?

assignsassert_template已被移除并提取到Rails 5中的gem

Source

答案 1 :(得分:0)

您有授权检查

authorize! :index, Contact
在分配到@contact之前

但是您的测试没有设置,以便以任何方式向请求用户授予权限。

为了发现这样的错误,在你展示的那个旁边进行额外的测试可能是有意义的。 E.g:

it "returns 200 (OK)" do
  get :index
  expect(response.response_code).to eq(200)
end