Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему
Я не делал этого с помощью RSpec, но у меня есть тест Test :: Unit, который делает что-то подобное для загрузки фотографии. Я установил загруженный файл в качестве экземпляра ActionDispatch :: Http :: UploadedFile следующим образом:
test "should create photo" do
setup_file_upload
assert_difference('Photo.count') do
post :create, :photo => @photo.attributes
end
assert_redirected_to photo_path(assigns(:photo))
end
def setup_file_upload
test_photo = ActionDispatch::Http::UploadedFile.new({
:filename => 'test_photo_1.jpg',
:type => 'image/jpeg',
:tempfile => File.new("#{Rails.root}/test/fixtures/files/test_photo_1.jpg")
})
@photo = Photo.new(
:title => 'Uploaded photo',
:description => 'Uploaded photo description',
:filename => test_photo,
:public => true)
end
Нечто похожее может работать и на вас.
Я не уверен, что вы можете протестировать загрузку файлов с помощью RSpec. Вы пробовали Capybara ?
Легко проверить загрузку файлов с помощью метода capybara attach_file
из спецификации запроса.
Например (этот код является только демо):
it "can upload a license" do
visit upload_license_path
attach_file "uploadLicense", /path/to/file/to/upload
click_button "Upload License"
end
it "can download an uploaded license" do
visit license_path
click_link "Download Uploaded License"
page.should have_content("Uploaded License")
end
Вы можете использовать метод fixture_file_upload для тестирования загрузки файлов: поместите тестовый файл в каталог «{Rails.root} / spec / fixtures / files
before :each do
@file = fixture_file_upload('files/test_lic.xml', 'text/xml')
end
it "can upload a license" do
post :uploadLicense, :upload => @file
response.should be_success
end
In Если вы ожидали файл в виде параметров ['upload'] ['datafile']
it "can upload a license" do
file = Hash.new
file['datafile'] = @file
post :uploadLicense, :upload => file
response.should be_success
end
Мне пришлось добавить оба из них, чтобы заставить его работать:
describe "my test set" do
include Rack::Test::Methods
include ActionDispatch::TestProcess
, если вы включили Rack :: Test *, просто включите методы тестирования
describe "my test set" do
include Rack::Test::Methods
, затем вы можете использовать метод UploadedFile:
post "/upload/", "file" => Rack::Test::UploadedFile.new("path/to/file.ext", "mime/type")
* ПРИМЕЧАНИЕ. Мой пример основан на Sinatra, который расширяет Rack, но должен работать с Rails, который также использует Rack, TTBOMK