1

「Project」のネストされたリソースとして「Mastertag」モデルがあり、作成アクションは次のとおりです。

def create
    @mastertag =  @project.mastertags.build(params[:mastertag])

    if @mastertag.save
         redirect_to project_mastertags_path, notice: 'Mastertag was successfully created.' 
      else
         render action: "new" 
    end
end

@project は before filter メソッドで初期化されます。

次のようなrspecテストがあります:

describe "POST create" do

   context "with valid params" do
      it "creates a new Mastertag" do

        expect {
          post :create, { project_id: @project.id, mastertag: FactoryGirl.attributes_for(:mastertag_without_project) }
        }.to change(Mastertag, :count).by(1)
   end
end

テストを実行すると、@mastertag.save メソッドは true を返しますが、カウントは変わりません。したがって、テストは失敗します。これはかなり奇妙に見えます。どこが間違っていますか?

4

2 に答える 2

2

私は Mongoid を使用しており、'Mastertags' は Project に埋め込まれていたため、Mastertags 用の個別のコレクションはありません。

コードを次のように変更する必要がありました。

describe "POST create" do

    context "with valid params" do
          it "creates a new Mastertag" do

            expect {
              post :create, { project_id: @project.id, mastertag: FactoryGirl.attributes_for(:mastertag_without_project) }
            }.to change {@project.reload.mastertags.count}.by(1)
    end
end

私はこの Stackoverflow の質問から助けを得ました: RSpec/Mongoid: 組み込みモデルのカウントを変更することを期待してください

于 2013-04-14T18:17:19.917 に答える
0

project_mastertags_pathを確認し、 @mastertag.saveの後のリダイレクトが機能することを確認します。

また、 create メソッドで に置き換えif @mastertag.saveてみてください。if @project.save

于 2013-04-14T16:46:51.117 に答える