【问题标题】:Functional test for a nested form嵌套表单的功能测试
【发布时间】:2013-02-25 00:02:06
【问题描述】:

我有 2 个模型:公司和用户。一个公司有很多用户,一个用户属于公司。 我创建了一个嵌套表单:注册时,您必须创建公司和第一个用户。

表单就像一个魅力,但我真的不知道如何为此编写测试。这里是脚手架生成的功能测试:

test "should create company" do
  assert_difference('Company.count') do
    post :create, company: { city: @company.city, name: @company.name}
  end
  assert_redirected_to company_path(assigns(:company))
end

这里我做了什么来测试用户创建:

test "should create company and first user" do
  assert_difference('Company.count') do
    assert_difference('User.count') do
      post :create, company: { city: @company.city, name: @company.name}, user: {name: @user.name, email: @user.email}
    end
  end
  assert_redirected_to company_path(assigns(:company))
end

当我运行测试时,出现以下错误:

1) Failure:
test_should_create_company_and_first_user(CompaniesControllerTest) [test/functional/companies_controller_test.rb:21]:
"User.count" didn't change by 1.
<3> expected but was
<2>.

我没有在网上找到帮助,所以我希望这里有人可以做到:)

【问题讨论】:

  • 您不应该在问题中发布答案。请从问题中删除答案,回答您自己的问题,将解决方案粘贴到那里,然后接受。它让社区的其他人更容易学习。
  • 谢谢!这很有帮助。

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 nested-forms


【解决方案1】:

如果表单实际上是嵌套的,那么您应该在测试请求中的公司对象中包含用户对象,如下所示:

post :create, company: { city: @company.city, name: @company.name, user: {name: @user.name, email: @user.email} }

【讨论】:

  • 谢谢!我认为您是对的,但我现在收到以下错误:Can't mass-assign protected attributes: users(这始终在测试日志中,当我填写表格时一切正常)。我检查了一下,我的公司模型中有attr_accessible :users_attributes。我还检查了我的用户模型,所有属性都可以访问。您知道嵌套表单是否存在功能测试示例?再次感谢!
  • 好的,我发现了问题所在。我将编辑第一篇文章以获得完整的示例。非常感谢您的帮助!
  • 很高兴我能够引导您朝着正确的方向前进!对不起,我没有 100% 正确。 :)
【解决方案2】:

解决方案

公司模式

attr_accessible :city, :name, :users_attributes
has_many :users
accepts_nested_attributes_for :users

用户模型

attr_accessible :email, :name
belongs_to :company

公司控制器测试

test "should create company and first user" do
  assert_difference('Company.count') do
    assert_difference('User.count') do
      post :create, company: { 
        city: @company.city, 
        name: @company.name, 
        users_attributes: {
          user: {name: @user.name, email: @user.email}, 
          user: {name: @user.name, email: @user.email}
        }
      }
    end
  end
  assert_redirected_to company_path(assigns(:company))
end

您可以在 users_attributes 中使用一个或多个用户进行测试。

感谢@drewinglis 的帮助:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2016-02-11
    相关资源
    最近更新 更多