0

我在互联网上搜索了很多东西以及关于 Stackoverflow 的其他类似问题,但是我仍然不确定如何在我的 rails 应用程序中测试嵌套资源的创建方法。

资源路线

resources :projects, :except => [:index, :show] do
      resources :mastertags
end

这是我要测试的操作:

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

    respond_to do |format|
      if @mastertag.save
        format.html { redirect_to project_mastertags_path, notice: 'Mastertag was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
  end

这是我相应的 Rspec 测试:

  context "with valid params" do
      it "creates a new Mastertag" do
        project = Project.create! valid_attributes[:project]
        mastertag = Mastertag.create! valid_attributes[:mastertag]
        expect {
          post :create, { project_id: project.id, :mastertag => valid_attributes[:mastertag] }
        }.to change(Mastertag, :count).by(1)
      end
  end

我有一个 valid_attributes 函数:

  def valid_attributes
      { :project => FactoryGirl.attributes_for(:project_with_researcher), :mastertag => FactoryGirl.attributes_for(:mastertag) }
  end

我收到以下错误:

Failure/Error: post :create, { project_id: project.id, :mastertag => valid_attributes[:mastertag] }
NoMethodError:
undefined method `reflect_on_association' for "5168164534b26179f30000a1":String

我也尝试了几种变体,但似乎没有任何效果。

4

2 回答 2

0

答案会根据您的 FactoryGirl 版本略有变化。

第一个问题是,@projet 是在哪里创建的?我猜其他地方?

您正在创建项目和主标签,为什么要这样做?

project = Project.create! valid_attributes[:project]
mastertag = Mastertag.create! valid_attributes[:mastertag]

这正是 FactoryGirl 在您致电时所做的Factory(:project)事情Factory(:mastertag)

下一个“wat”是您在规范中创建一个主标签。您不会在任何地方使用该变量。如果不解决您的问题,您的规范看起来会更好,如下所示:

it "creates a new Mastertag" do
  project = Factory(:project)
  expect {
    post :create, { project_id: project.id, :mastertag => Factory.attributes_for(:mastertag)}
  }.to change(Mastertag, :count).by(1)
end

好的,现在我们已经完成了规范的清理,让我们看看你的错误。

好像在这一行

format.html { redirect_to project_mastertags_path, notice: 'Mastertag was successfully created.' }

此路径需要一个项目 ID。

format.html { redirect_to project_mastertags_path(@project), notice: 'Mastertag was successfully created.' }
于 2013-04-12T14:42:34.200 回答
0

@John Hinnegan 的回答是绝对正确的。我只想补充一点,在项目上使用 Id 很重要,而不仅仅是项目:

有时在参数中使用 project: 可能很明显,但这不起作用。

作品:

 expect {
      post :create, { project_id: project.id, :mastertag => valid_attributes[:mastertag] }
    }.to change(Mastertag, :count).by(1)

不工作:

 expect {
      post :create, { project: project.id, :mastertag => valid_attributes[:mastertag] }
    }.to change(Mastertag, :count).by(1)
于 2013-12-15T16:36:01.523 回答