Ruby on Rails 2.3.8: тестирование: как настроить переменную экземпляра для использования в моих тестах? - PullRequest
1 голос
/ 21 июня 2011

Допустим, у меня есть некоторые данные, которые остаются неизменными во всех моих тестах, навсегда и на вечность.Я создаю эти данные в setup.Я храню данные в @instance_var.Но когда я вызываю @ instance_var.attribute в любом тесте, я получаю следующую ошибку:

RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

Я знаю, что моя переменная экземпляра не равна нулю, потому что после того, как она установлена, я могу сделать ставку @instance_var.inspect на нем ...

Есть идеи?

РЕДАКТИРОВАТЬ:

 setup do
    user = Factory(:user)
    account = Factory(:account)    

    set_user(user)
    set_account(account)


    puts "||||||||||||||||||||||||||||||||||||||||||||||" #this proves that the instance vars are not null
    puts "| object_test.rb                            |"
    puts "|      #{@user.name}                   "
    puts "|      #{@account.name}                "
    puts "||||||||||||||||||||||||||||||||||||||||||||||"
  end

Неудачный тест (с ошибкой выше)

test "for detection of first content with multiple contents" do
      object = Factory(:object, :user_id => @user.id, :account_id => @account.id)
   ... #the rest of this test isn't important, as it is the above line, on @user, where the nil.id error occers

в test_helper.rb

def set_user(user)
  @user = user
end

def set_account(account)
  @account = account
end

Я не думаю, что мне нужны эти два метода, так как, когда я определяю переменную @instance в настройке, я получаю тот же результат

в test_helper.rb есть некоторые константы, установленные перед ActiveSupport :: TestCase:

  self.use_transactional_fixtures = true

  self.use_instantiated_fixtures  = false

  fixtures :all

, отключение которых ничего не сделало.= (

Ответы [ 2 ]

0 голосов
/ 24 июня 2011

Мое решение состояло в том, чтобы создать общий класс shared_test.rb

require 'test_helper'

class SharedTest
  def self.initialize_testing_data
    self.reset_the_database

    self.set_up_user_and_account
    # make sure our user and account got created 
    puts "|||||||||||||||||||||||||||||||||||||||||||||"
    puts "| The user and account "
    puts "| we'll be testing with:"
    puts "|             #{@user.name}"
    puts "|             #{@user.account.name}"
    puts "|||||||||||||||||||||||||||||||||||||||||||||"
  end

  def self.reset_the_database
    #clear the database and reset it
    call_rake("db:test:prepare")
    call_rake("db:bootstrap RAILS_ENV=test")
  end

  def self.set_up_user_and_account
    #set up our user for doing all our tests (this person is very busy)  
    @user = Factory(:user)
    @account = Factory(:account)    
    @user.account = @account
    @user.save
  end
end

, чтобы в начале каждого тестового файла, который требует, чтобы пользователь и учетная запись оставались неизменными во всех тестах, достаточно

require 'shared_test.rb'

и методы называются как

SharedTest.initialize_testing_data 
0 голосов
/ 21 июня 2011

Вы пробовали

setup do
  @user = Factory(:user)
  @account = Factory(:account)
end

Обычно, если вы устанавливаете переменные экземпляра в блоке настройки, они должны быть доступны для всех ваших тестов. (Возможно, у вас проблема с областями действия.)

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