RSpec指定(:items).should eq([item])返回nil

时间:2013-02-02 09:38:38

标签: ruby-on-rails

我对RSpec很新,显然做错了。

使用Index action:

class TransactionsController < ApplicationController

  before_filter :authenticate_user!
  def index
    @transactions = current_user.transactions
    respond_to do |format|
      format.html { render layout: "items" } # index.html.erb
      format.json { render json: @transactions }
    end
  end
end

并为索引操作设置默认的RSpec测试。

require 'spec_helper'

describe TransactionsController do
   describe "GET index" do
     it "assigns all transactions as @transactions" do
       transaction = FactoryGirl.create(:transaction)
       get :index
       assigns(:transactions).should eq([transaction])
     end
   end
end

所以一切正常,除了行assigns(:transactions).should eq([transaction])返回nil,所以我得到了这个错误:

Failure/Error: assigns(:transactions).should eq([transaction])

   expected: [#<Transaction id: 1, user_id: 1, text: "some transaction", date: "2013-02-02", money: #<BigDecimal:b8a8e90,'0.999E1',18(18)>, created_at: "2013-02-02 09:17:42", updated_at: "2013-02-02 09:17:42">]
        got: nil

   (compared using ==)
 # ./spec/controllers/transactions_controller_spec.rb:17:in `block (3 levels) in <top (required)>'

感谢任何提示,因为我花了一整天的时间。

2 个答案:

答案 0 :(得分:10)

首先,如果您使用before_filter :authenticate_user!,则需要传递该过滤器。

可以使用sign_in some_user

来完成

其次,当您分配交易@transactions = current_user.transactions

并且您希望规范中应该有一些,您必须创建分配给当前用户的事务FactoryGirl.create(:transaction, user: some_user)

答案 1 :(得分:0)

你能检查一下get:controller到controller.index的工作原理吗?如果是,您必须检查路线