Rails 3控制器测试

时间:2011-08-30 17:45:57

标签: ruby-on-rails testing

我正在用Rails 3编写一个应用程序。在我的功能测试中,test / functional / cust_infos_controller_test.rb,我有这些:

require 'test_helper'

class CustInfosControllerTest < ActionController::TestCase
  # Replace this with your real tests.
  test "should get cust" do
    get :customerinfo
    assert_response :success
    assert_not_nil assigns("cust_infos")
  end
end

我的控制器非常简单,因为它只是找到所有客户的信息:

class CustInfosController < ApplicationController
  def customerinfo
    @cust_info = CustInfo.find(:all, :order=>"cust_id")
    @cust_info.each do |ci|                                             
      if ci.upload_freq == 'W'
        ci.upload_freq = 'Weekly'
      elsif ci.upload_freq == 'M'
        ci.upload_freq = 'Monthly'
      end
    end
  end
end

当我用它运行时:

$ ruby -Itest test/functional/cust_infos_controller_test.rb

我收到以下错误:

Loaded suite test/functional/cust_infos_controller_test
Started
E
Finished in 0.025258 seconds.

1) Error:
test_should_get_cust(CustInfosControllerTest):
ActiveRecord::StatementInvalid: PGError: ERROR:  numeric field overflow
DETAIL:  A field with precision 4, scale 0 must round to an absolute value less than 10^4.

: INSERT INTO "cust_infos" ("cust_id") VALUES (298486374)


1 tests, 0 assertions, 0 failures, 1 errors

在我的cust_infos表中,我将cust_id作为整数。但我不知道为什么当我运行控制器测试以获得一些记录时,活动记录将执行insert语句。我该如何解决这个问题?

更新:我注释掉了customerinfo方法中的所有行,并运行相同的测试。得到了完全相同的结果。所以我猜这不是我的方法行为,而是Rails?任何提示?

2 个答案:

答案 0 :(得分:0)

我明白你要做什么。您需要做的是为您的视图创建一个帮助器。

application_helper.rb

def display_upload_freq(s)
  case s
  when 'W'
    'Weekly'
  when 'M'
    'Monthly'
  end
end

cust_info_controller.rb

class CustInfosController < ApplicationController
  def customerinfo
    @cust_info = CustInfo.find(:all, :order=>"cust_id")
  end
end

然后在您查看迭代@cust_info时,对于upload_freq,请使用dislay_upload_freq(ci.upload_freq)。假设你有@ cust_info.each做| ci |。那么你不会混淆数据库与保存任何东西。

答案 1 :(得分:0)

您是否使用工厂或灯具来创建测试数据?如果没有,你是如何创造它的?我的猜测是,在设置测试数据时会发生插入,而不是因为控制器中发生了任何事情。这个猜测的第二部分是由于注释掉控制器中的所有代码并没有消除错误这一事实。