Светильники в RSpec
Я новичок в использовании RSpec для написания тестов в приложении Rails, которое использует базу данных MySQL. Я определил свои приборы и загружаю их в свою спецификацию следующим образом:
before(:all) do
fixtures :student
end
Сохраняет ли это декларацию данные, определенные в моих документах в таблице учеников, или просто загружает данные в таблицу во время выполнения тестов и удаляет их из таблицы после выполнения всех тестов?
Ответы
Ответ 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. Подробнее см. здесь.