Где Rails хранит данные, созданные путем сохранения объектов activerecord во время тестов? - PullRequest
6 голосов
/ 13 января 2009

Где Rails хранит данные, созданные путем сохранения объектов activerecord во время тестов?

Мне показалось, что я знаю ответ на этот вопрос: очевидно, в _test базе данных . Но похоже, что это не так !

Я использовал эту систему для проверки того, что происходит с сохраненными данными ActiveRecord во время тестов rspec:

$ rails -d mysql test

$ cd test

$ nano config / database.yml ...

... создание баз данных mysql test_test, test_development, test_production

$ script / generate rspec

$ script / generate rspec_model foo

редактировать миграцию Foo:

class CreateFoos 

<p>$ rake db:migrate</p>

<p>edit spec/models/foo_spec.rb:</p>

<pre>
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe Foo do
  before(:each) do
    @valid_attributes = {
      :bar => 12345
    }
  end

  it "should create a new instance given valid attributes" do
    foo = Foo.new(@valid_attributes)
    foo.save
    puts "sleeping..."
    sleep(20)
  end
end

$ рейк спецификация

Когда вы видите «спящий ...», переключитесь на другой открытый терминал с сеансом mysql, подключенным к базе данных test_test, и выполните:

mysql> select * from foos; Пустой набор (0,00 с)

Почему сеанс mysql не показывает никаких записей в базе данных test_test во время выполнения теста?

Ответы [ 3 ]

13 голосов
/ 13 января 2009

Элементы в тестовой базе данных по умолчанию стираются после каждого теста. Это сделано для того, чтобы убедиться, что каждый из ваших тестов имеет свою собственную «песочницу» для игры, которая не вызывает никаких взаимодействий с тестами до него.

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

Тем не менее, я полагаю, что если вы измените файл test / test_helper.rb, сказав следующее:

self.use_transactional_fixtures = false

вместо

self.use_transactional_fixtures = true

Это приведет к сохранению данных в вашей тестовой базе данных.

ТАКЖЕ: Мой совет специально предназначен для работы с Test :: Unit, а не с RSpec. Тем не менее, я полагаю, что вам нужен аналогичный параметр вашего spec_helper.rb.

3 голосов
/ 13 января 2009

"Но почему запрос mysql не показывает данных в базе данных во время выполнения теста?"

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

1 голос
/ 13 января 2009

Вы можете наблюдать записи, добавляемые в тестовую базу данных с помощью:

tail -f log/test.log

По мере выполнения тестов вы должны видеть, как выполняются транзакции.

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