Как я могу проверить HTTP-запрос от спецификации модели в Rspec - PullRequest
0 голосов
/ 24 мая 2011

Я загружаю изображение в свою модель Imagecollection с использованием CarrierWave и хочу проверить, что когда я загружаю изображение, оно действительно доступно в Интернете.И что, когда я удаляю изображение, оно на самом деле удаляется.

Я использую бэкэнд S3, поэтому я хотел бы проверить это в самой модели, без необходимости иметь какие-либо зависимости контроллера, или запуститьинтеграционные тесты.Поэтому мне нужно создать URL-адрес, выполнить запрос HTTP и проверить его код возврата.Этот код не работает, но есть способ сделать что-то похожее на следующее:

describe "once uploaded" do
  subject {Factory :company_with_images} 

  it "should be accessible from a URL" do
    image_url = subject.images.first.image.url
    get image_url                                   # Doesn't work
    response.should be_success                      # Doesn't work
  end
end

РЕДАКТИРОВАТЬ:

Я закончил тем, что добавил это в свойGemfile

gem rest-client

И использующий: fog для своих тестов.В идеале я мог бы изменить бэкэнд во время теста на что-то вроде

before do
  CarrierWave.configure do |config|
     config.storage = :fog
  end
end

describe tests
end

after do
  CarrierWave.configure do |config|
     config.storage = :end
  end
end

Но это, похоже, на самом деле ничего не делает.

describe "once uploaded" do
  describe "using the :fog backend" do
    subject {Factory :company_with_images} 

    # This test only passes beecause the S3 host is specified in the url.
    # When using CarrierWave :file storage, the host isn't specified and it
    # fails
    it "should be accessible from a URL" do
      image_url = subject.images.first.image.url
      response = RestClient.get image_url
      response.code.should eq(200)
    end
  end

  describe "using the :file backend" do
    subject {Factory :company_with_images} 

    # This test fails because the host isn't specified in the url
    it "should be accessible from a URL" do
      image_url = subject.images.first.image.url
      response = RestClient.get image_url
      response.code.should eq(200)
    end
  end
end

Ответы [ 3 ]

1 голос
/ 24 мая 2011

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

0 голосов
/ 13 июня 2011

В итоге я переопределил спецификацию следующим образом

  describe "using the :fog backend" do
    subject {Factory :company_with_images} 

    it "should be accessible from a URL" do
      image_url = subject.images.first.image.url
      rest_response(image_url).code.should eq(200)
    end
  end

с этим помощником

def rest_response url
  # https://github.com/archiloque/rest-client
  RestClient.get(url){|response, request, result| response }
end

и с использованием гема restclient

0 голосов
/ 24 мая 2011

Вы не можете протестировать s3, если файлы фактически не загружены в s3.А в carrierwave по умолчанию он не загружается на s3.

, вместо этого проверяется правильность image_url:

image_url = subject.images.first.image.url
image_url.should == "http://.....'
...