0

我是 Rails 测试的新手,我有一个问题:假设我的控制器中有一个简单的场景:

class UsersController < ApplicationController

  def create
    @user = User.create(params[:user])
    if params[:user][:birth_date]
      Birthday.create(:title => "#{user.first_name} #{user.last_name}'s Birthday!", :date => params[:user][:birth_date].to_date, :user_id => @user.id)
    end
  end

  def update
    @user = User.find(params[:id])
    @user.update_attributes(params[:user])
    if params[:user][:birth_date]
      @birthday = Birthday.find_by_user_id(@user.id)
      @birthday.update_attributes(:date => params[:user][:birth_date].to_date) if @birthday
    end
  end
end

我想测试每次创建用户时都会创建生日事件并且它的属性设置正确。在我的特定(真实)案例中,当创建(或更新)另一个对象时创建(或更新)一个新对象,并且计算并自动设置了许多属性。我需要测试它们是否设置正确。我该如何测试它?

4

2 回答 2

0

如果您使用的是 Test::Unit 或 RSpec,您可以通过“assigns”方法访问全局变量。例如,您可以使用以下内容:

post :update, :id => 1, :user => {:birthdate => '1/1/2000'}
assert_equal Date.new(2000, 1, 1), assigns(:user).birthday.date

您还可以测试数据库是否已正确更新:

user = User.find(1)
assert_equal Date.new(2000, 1, 1), user.birthday.date
于 2012-10-07T21:21:42.477 回答
0

测试正确的对象

您想测试填充用户数据的对象,或者可能是用户模型中的回调。这通常不是控制器问题,特别是如果您遵循“胖模型,瘦控制器”范例。

在您的特定情况下,您的控制器正在调用生日#update_attributes,但真正的变化发生在其他地方,所以我会在那里测试它们。对于这个特定控制器,唯一真正有用的测试是确保在创建或更新模型数据时不会引发任何问题,但这更像是集成测试而不是单元测试。

于 2012-10-07T21:09:05.653 回答