0

申し訳ありませんが、これは自分の頭を蹴りたいように感じ始めています. 私はRSpecに完全に困惑しています。ビデオを次から次へと見て、チュートリアルを次から次へと読んでいますが、それでも私は正方形の 1 つで立ち往生しています。

===これが私が取り組んでいるものです

http://github.com/fudgestudios/bort/tree/master

=== エラー

F

1)
NoMethodError in 'bidding on an item should work'
You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.new_record?
spec/controllers/auction_controller_spec.rb:16:
spec/controllers/auction_controller_spec.rb:6:

Finished in 0.067139 seconds

1 example, 1 failure

=== これが私のコントローラーアクションです

  def bid

      @bid = Bid.new(params[:bid])
      @bid.save

  end

=== これが私のテストです

require File.dirname(__FILE__) + '/../spec_helper'
include ApplicationHelper
include UsersHelper
include AuthenticatedTestHelper

describe "bidding on an item" do
  controller_name :items

    before(:each) do
      @user = mock_user
      stub!(:current_user).and_return(@user)
    end

  it "should work" do
    post 'bid', :bid => { :auction_id => 1, :user_id => @user.id, :point => 1 }
    assigns[:bid].should be_new_record
  end

end

=== spec_helper

http://github.com/fudgestudios/bort/tree/master/spec/spec_helper.rb

仕事のために午前 3 時に起きて、その日何も成し遂げられないのは、とてもがっかりします。ご理解ください。

4

4 に答える 4

18

before(:each) には、逆方向のものがいくつかあります。この例では、投稿のカウントを 1 増やすように指定しているため、実際のレコードを扱っているため、何かをスタブする理由はまったくありません。また、この時点では例が 1 つしかないため、before ブロックを使用する理由はありません。私はこのようにします:

describe ItemsController, "bidding on an item" do
  fixtures :users

  it "should create a new Bid" do
    login_as :quentin
    lambda do
      post 'bid', :bid => { :auction_id => 1, :user_id => @user.id, :point => 1 }
    end.should change(Bid, :count).by(1)
  end

end

私がお勧めすることの 1 つは、これらのものをよりよく理解するまで、今のところ非常に細かく作成することです。期待から始めて (投稿は入札数を変更する必要があります)、仕様を実行し、失敗メッセージに従って、仕様またはコードに必要なものを追加します。

于 2009-01-01T17:46:13.467 に答える
2

編集:モックオブジェクトを使用するときにBid.countが増加することを期待するべきではありません。私が忘れたマントラ:コードの前のカフェイン。

今のところ、行をコメントアウトするだけなので、オリジナルはまだそこにあります。

require File.dirname(__FILE__) + '/../spec_helper'
include ApplicationHelper
include UsersHelper
include AuthenticatedTestHelper

describe "POST to bid_controller" do
  controller_name :items

  before(:each) do
        #@bid = mock_model(Bid)           # create a new mock model so we can verify the appropriate things
        #Bid.stub!(:new).and_return(@bid) # stub the new class method on Bid to return our mock rather than a new ActiveRecord object.
                                         # this separates our controller spec entirely from the database.
  end

  it "should create a new Bid" do
    lambda do
        post 'bid', :bid => { :auction_id => 1, :user_id => @user.id, :point => 1 }
    end.should change(Bid, :count).by(1)
  end

    # ... more specs
end

できるだけ小さな仕様を記述し、その仕様で何を検証する必要があるかが明確になるように設定を記述してください。たとえば、私があなたをからに変更しit "should work"た方法it "should create a new Bid"。そのコントローラーにさらに多くのものがある場合は、機能の小さな部分ごとに新しい仕様を記述します。

模擬ユーザーが必要になった場合は、restful_authenticationを簡単にするためのヘルパーがいくつかあります。まず、次のようにでユーザーフィクスチャを作成します RAILS_ROOT/spec/fixtures/users.yml

quentin:
  login: quentin
  email: quentin@example.com
  salt: 7e3041ebc2fc05a40c60028e2c4901a81035d3cd
  crypted_password: 00742970dc9e6319f8019fd54864d3ea740f04b1 # test
  created_at: <%= 5.days.ago.to_s :db %>
  activation_code: 8f24789ae988411ccf33ab0c30fe9106fab32e9b 
  activated_at: <%= 5.days.ago.to_s :db %> 
  name: "Quentin"

次に、仕様で次のように記述し、current_userメソッドとrestul_authenticationの他のすべての部分を実行時に期待どおりに動作させることができます。

login_as :quentin
# .... the rest of your spec

さらにいくつかの仕様の例として、さらにいくつかの例として追加する場合があります。

def do_post
    # extracting the method under test, so I don't repeat myself
    post 'bid', :bid => { :auction_id => 1, :user_id => @user.id, :point => 1 }
end

it "should create a new Bid" do
    lambda do
    do_post
    end.should change(Bid, :count).by(1)
end

it "should assign the Bid to the proper auction" do
    @bid.should_receive(:auction_id=).with(1) # test this, I believe doing  Bid.new(params[:bid]) sets the id directly not sets the model
    do_post
end

it "should assign the Bid the proper points" do
    @bid.should_receive(:point=).with(1)
    do_post
end
于 2009-01-01T16:12:13.360 に答える
0

何が起こっているのかよくわかりませんが。(スタブとラムダを使用)...

為に

def bid
  @bid = Bid.new params[:bid]
  @bid.save
end

次のパス !!

require File.dirname(__FILE__) + '/../spec_helper'
include ApplicationHelper
include UsersHelper
include AuthenticatedTestHelper

describe "bidding on an item" do
  controller_name :items
  fixtures :users

  before(:each) do
    @user = login_as :quentin
    @bid = mock_model(Bid)           # create a new mock model so we can verify the appropriate things
    @bid.stub!(:new).and_return(@bid) # stub the new class method on Bid to return our mock rather than a new ActiveRecord object.
    #Bid.stub!(:save).and_return(true)# this separates our controller spec entirely from the database.
  end

  it "should create a new Bid" do
    lambda do
      post 'bid', :bid => { :auction_id => 1, :user_id => @user.id, :point => 1 }
    end.should change(Bid, :count).by(1)
  end

end
于 2009-01-01T17:13:09.713 に答える