Подтвердить что ты не робот

Светильники в RSpec

Я новичок в использовании RSpec для написания тестов в приложении Rails, которое использует базу данных MySQL. Я определил свои приборы и загружаю их в свою спецификацию следующим образом:

before(:all) do
  fixtures :student
end

Сохраняет ли это декларацию данные, определенные в моих документах в таблице учеников, или просто загружает данные в таблицу во время выполнения тестов и удаляет их из таблицы после выполнения всех тестов?

4b9b3361

Ответ 1

Если вы хотите использовать светильники с RSpec, укажите свои приборы в описываемом блоке, а не в переднем блоке:

describe StudentsController do
  fixtures :students

  before do
    # more test setup
  end
end

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

Ответ 2

Прежде всего: вы не можете использовать метод fixtures в :all/:context/:suite hook. Не пытайтесь использовать светильники в этих крючках (например, post(:my_post)).

Вы можете подготовить светильники только в описываемом/контекстном блоке, так как Infuse пишет раньше.

Вызов

fixtures :students, :teachers

не загружать данные в БД! Просто подготавливает вспомогательные методы students и teachers. Запрошенные записи загружаются лениво в тот момент, когда вы сначала пытаетесь получить к ним доступ. Прямо перед

dan=students(:dan) 

Это загрузит студентов и преподавателей в путь delete all from table + insert fixtures.

Итак, если вы подготовите некоторых студентов до (: context) hook, они исчезнут сейчас.

Вставка записей выполняется только один раз в наборе тестов.

Записи из светильников не удаляются в конце набора тестов. Они удаляются и повторно вставлены в следующий запуск тестового набора.

пример:

 #students.yml
   dan:
     name: Dan 
   paul:
     name: Paul

 #teachers.yml
    snape:
      name: Severus




describe Student do
  fixtures :students, :teachers

  before(:context) do
    @james=Student.create!(name: "James")
  end

  it "have name" do
   expect(Student.find(@james.id).to be_present
   expect(Student.count).to eq 1
   expect(Teacher.count).to eq 0

   students(:dan)

   expect(Student.find_by_name(@james.name).to be_blank
   expect(Student.count).to eq 2
   expect(Teacher.count).to eq 1

  end
end


#but when fixtures are in DB (after first call), all works as expected (by me)

describe Teacher do
  fixtures :teachers #was loade in previous tests

  before(:context) do
    @james=Student.create!(name: "James")
    @thomas=Teacher.create!(name: "Thomas")
  end

  it "have name" do
   expect(Teacher.find(@thomas.id).to be_present
   expect(Student.count).to eq 3 # :dan, :paul, @james
   expect(Teacher.count).to eq 2 # :snape, @thomas

   students(:dan)

   expect(Teacher.find_by_name(@thomas.name).to be_present
   expect(Student.count).to eq 3
   expect(Teacher.count).to eq 2

  end
end

Все ожидания в тестах выше пройдут

Если эти тесты снова запускаются (в следующем пакете) и в этом порядке, чем ожидание

 expect(Student.count).to eq 1

НЕ будет выполнено! Будет 3 ученика (: dan,: paul и new new @james). Все они будут удалены до students(:dan) и только: paul и: dan будут вставлены снова.

Ответ 3

before(:all) хранит точные данные, так как он загружается/создается один раз. Вы делаете свое дело, и в конце теста он остается. Вот почему bui link after(:all) уничтожает или использует before(:each); @var.reload!;end, чтобы получить последние данные из тестов раньше. Я могу увидеть, используя этот подход во вложенных блоках описания rspec.

Ответ 4

Это зависит от способа настройки RSpec. Подробнее см. здесь.