0

我有 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>.

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

4

2 回答 2

2

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

post :create, company: { city: @company.city, name: @company.name, user: {name: @user.name, email: @user.email} }
于 2013-02-25T00:21:32.950 回答
0

解决方案

公司模式

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

于 2014-04-09T03:58:44.550 回答