Тест контроллера Rails 3 - PullRequest
       3

Тест контроллера Rails 3

0 голосов
/ 30 августа 2011

Я пишу приложение с Rails 3. В моем функциональном тесте test / functions / 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 как целое число. Но я не знаю, почему, когда я запустил тест контроллера, чтобы получить какую-то запись, активная запись выполнит оператор вставки. Как мне это исправить?

ОБНОВЛЕНИЕ: Я закомментировал все строки в методе customerinfo и провел тот же тест. Получил точно такой же результат. Я предполагаю, что это не мои методы поведения, а скорее Rails? Любой намек?

Ответы [ 3 ]

0 голосов
/ 31 августа 2011

Используете ли вы фабрики или приборы для создания ваших тестовых данных? Если нет, как вы это создаете? Я предполагаю, что вставка происходит при настройке ваших тестовых данных, а не из-за того, что что-то происходит в вашем контроллере. Вторая часть этого предположения подтверждается тем фактом, что комментирование всего кода в вашем контроллере не избавляет от ошибки.

0 голосов
/ 14 августа 2015

Я знаю, что это сообщение довольно старое, но я опубликую свой ответ на случай, если кого-то привезут сюда поисковые системы. У меня была точно такая же проблема, проблема возникает из файла (ов) фикстур в test / fixtures / {name_of_your_model} .yml. Rails добавляет некоторые начальные значения в этот файл, в моем случае это выглядело так:

one: {}
# column: value
#
two: {}
#  column: value

и когда вы захотите запустить тест, он попытается создать тестовую базу данных, используя эти приборы. И вот где проблема возникает. Попытка создать пустую запись, пока вы не допустили нулевой идентификатор в вашей таблице.

Удаление этих приборов или заполнение их соответствующими значениями должно решить проблему.

0 голосов
/ 30 августа 2011

Я вижу, что вы пытаетесь сделать.Что вам нужно сделать, это создать помощника для вашего представления.

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 do | ci |.Тогда вы не будете путать БД с сохранением чего-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...