Тесты - Evanto/qna GitHub Wiki

  • Betterspecs - большой полезный ресурс по тестированию с RSpec.
  1. Если в фабрике верно указанные связные сущности, то при вызове
    let(:answer) { create(:answer) }
    кроме answer будут созданы также question и user, к которым можно обращаться через answer.question и answer.user. Если же нужно создать ответ для конкретного пользователя, то сначала создаётся user, а потом answer:
    let(:user) { create(:user) }
    let(:answer) { create(:answer, user: user) }
  1. RSpec let vs let!
  • let загружается лениво: он не создается до тех пор, пока RSpec не дойдет до первого метода, который использует этот объект. При этом значение объекта запоминается, и в рамках 1-го теста сохраняет одно и то же значение, но не сохраняет его между двумя тестами в одном файле. Например, если написать let(:count) { $count += 1 }, то в первом it count всегда будет 1, а во втором it - уже 2. let создает объект там, где он первый раз встречается после строки, где он прописан, сохраняет значение в рамках первого теста, но меняется/не сохраняется в других тестах того же файла.
    let will not actually do anything until the object is being called anywhere in your specs
  • let! создаёт объект на месте - сразу в той строке, где написан (не ожидая, когда его где-то вызовут ниже). Принудительно создает объект сразу, выполняется сразу после объявления. Полезен для заполнения базы необходимыми данными, которые будут гарантированно доступны на момент выполнения теста.

Links: