RoR:创建测试对象

时间:2012-10-07 20:53:55

标签: ruby-on-rails testing

我是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

我想测试每次创建用户时都会创建生日事件并且正确设置了它的属性。在我的特定(实际)情况下,我有一个新对象在创建(或更新)另一个对象时被创建(或更新),并且计算并自动设置了许多属性。我需要测试它们是否设置正确。我该怎么测试呢?

2 个答案:

答案 0 :(得分:0)

测试正确的对象

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

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

答案 1 :(得分: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