1

我有一个“Mastertag”模型作为“Project”的嵌套资源,其创建操作如下:

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 在过滤器之前的方法中初始化。

我有一个 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: Expect to change count on embedded models

于 2013-04-14T18:17:19.917 回答
0

检查您的project_mastertags_path并确保在@mastertag.save有效之后进行重定向。

另外,尝试在您的创建方法中替换if @mastertag.save为。if @project.save

于 2013-04-14T16:46:51.117 回答