Допустим, у вас есть тест для пользователя модели, по умолчанию UserTest#test_the_truth
rails test test/models/user_test.rb
Я полагаю, вы получаете ошибку Errno::ENOENT: No such file or directory @ rb_sysopen
во время теста из-заошибка в вашем пути, вы должны добавить 'fixtures'
, она должна выглядеть следующим образом:
# users.yml
one:
name: 'Jim Kirk'
avatar: <%= File.open Rails.root.join('test', 'fixtures', 'files', 'image.png').to_s %>
, но теперь у вас должна быть эта ошибка: ActiveRecord::Fixture::FixtureError: table "users" has no column named "avatar".
Это правильно, потому что ActiveStorage используетдве таблицы для работы: active_storage_attachments
и active_storage_blobs
.
Итак, вам нужно удалить столбец аватара из users.yml
и добавить два новых файла:
# active_storage_attachments.yml
one:
name: 'avatar'
record_type: 'User'
record_id: 1
blob_id: 1
и
# active_storage_blobs.yml
one:
id: 1
key: '12345678'
filename: 'file.png'
content_type: 'image/png'
metadata: nil
byte_size: 2000
checksum: "123456789012345678901234"
Кроме того, в App/models
добавьте , даже если это не требуется для работы ActiveStorage .
# active_storage_attachment.rb
class ActiveStorageAttachment < ApplicationRecord
end
и
# active_storage_blob.rb
class ActiveStorageBlob < ApplicationRecord
end
Тогда UserTest#test_the_truth
удастся.
Но лучше избавиться от active_storage_attachment.rb
и active_storage_blob.rb
и следовать другому способу проверки.
Для проверки, является ли вложениерабочий, лучше протестируйте контроллер , например добавив этот код в test/controllers/users_controller_test.rb
:
require 'test_helper'
class UserControllerTest < ActionController::TestCase
def setup
@controller = UsersController.new
end
test "create user with avatar" do
user_name = 'fake_name'
avatar_image = fixture_file_upload(Rails.root.join('test', 'fixtures', 'files', 'avatar.png'),'image/png')
post :create, params: {user: {name: user_name, avatar: avatar_image}}
end
end
Проверьте папку tmp/storage
, должна быть пустой.
Launchтест с: rails test test/controllers/users_controller_test.rb
Это должно завершиться успешно, тогда, если вы вернетесь в tmp/storage
, вы найдете несколько папок и файлов, сгенерированных тестом.
Редактируйте после комментариев: Если вынужно проверить обратные вызовы на User
модели, тогда это должно работать:
# rails test test/models/user_test.rb
require 'test_helper'
class UserTest < ActiveSupport::TestCase
test "should have avatar attached" do
u = User.new
u.name = 'Jim Kirk'
file = Rails.root.join('test', 'fixtures', 'files', 'image.png')
u.avatar.attach(io: File.open(file), filename: 'image.png') # attach the avatar, remove this if it is done with the callback
assert u.valid?
assert u.avatar.attached? # checks if the avatar is attached
end
end
Я не знаю ваш обратный вызов, но я надеюсь, что это дает вам некоторую подсказку.