0

機能テストを作成しようとしています。私のテストは次のようになります。

describe PostsController do
  it "should create a Post" do
    Post.should_receive(:new).once
    post :create, { :post => { :caption => "ThePost", :category => "MyCategory" } }
  end
end

私の PostsController (実際にはその一部) は次のようになります。

PostController < ActiveRecord::Base

  def create
    @post = Post.new(params[:post])
  end

end

テストを実行すると、常に失敗が返されます。これは、Post クラスが :new を期待していたが、取得できなかったというものです。それでも、実際の投稿は作成されます。

私はRSpecの初心者です。何か不足していますか?

4

2 に答える 2

1

編集- 前のゴミを捨てた

これはあなたが望むことをするはずです

require File.dirname(__FILE__) + '/../spec_helper'

describe PostsController do
  it "should create a Post" do
    attributes = {"Category" => "MyCategory", "caption" => "ThePost"}
    Post.stub!(:new).and_return(@post = mock_model(Post, :save => false))
    Post.should_receive(:new).with( attributes ).and_return @post
    post :create, { :post => attributes }
  end
end

これは、rspecs 独自のモック ライブラリを使用していて、rspec_rails gem がインストールされていることを前提としています。

于 2010-04-30T15:16:57.490 に答える
0

here でcontroller説明されているように、Rspec-railsの方法を使用して、コントローラーでメッセージの期待値をテストできます。したがって、アクションをテストする 1 つの方法は次のようになります。create

describe PostsController do
  it "should create a Post" do
    controller.should_receive(:create).once
    post :create, { :post => { :caption => "ThePost", :category => "MyCategory" } }
  end
end

EDIT(議論をする)

アクションの実装に依存するテストを作成することをお勧めしますcreate。コントローラーの適切な責任以外のことをテストしている場合、リファクタリング時にテストを壊し、実装が変更されたときに戻ってテストを書き直さなければならないリスクがあります。

create アクションの役割は、何かを作成することです。そのため、次のようにテストします。

Post.count.should == 1

作成方法に依存せずに、投稿が作成されたかどうかがわかります。

編集#2(ええと...)

元の質問から、投稿が作成されていることを既に知っていることがわかります。実装ではなく動作をテストする必要があり、モデルがメッセージを受信するかどうかを確認することは、コントローラーのテストでは良いことではありません。たぶん、あなたがしているのはテストではなくデバッグですか?

于 2010-04-29T18:21:25.073 に答える