имитация исключения недопустимой активной записи с помощью Rspec - PullRequest
0 голосов
/ 12 июля 2020

Я высмеиваю исключение из-за недопустимой активной записи в rspe c.

вот метод, с которым я столкнулся с проблемой. image_processing_error проверяет наличие ошибок объекта изображения.

def save_image(image)
  begin
    image.save!
      { message: I18n.t("messages.image_saved") , status: 200 }
    rescue ActiveRecord::RecordInvalid
      image_processing_error(image)
  end
end

private

def image_processing_error(image = nil)
  if image && image.errors.any? && image.errors.messages.any?
    { message: image.errors.messages.values[0][0] , status: 422 }
  else
    { message: I18n.t("errors.invalid_request"), status: 422 }
  end
end 

А вот мой rspe c для того же

# frozen_string_literal: true

require "rails_helper"

RSpec.describe ImagesService do
  describe ".save_image" do
    context "save image throws error" do
      let(:image) { double("image", { "errors": { "messages": { "name": ["is invalid", "must be implemented"]}}}) }

      before do
        allow(image).to receive(:save!).and_raise(ActiveRecord::RecordInvalid)
      end
      subject { described_class.save_image(image) }
      it "raised the error" do
        // I want to test the **ActiveRecord::RecordInvalid
        // I places NoMethodError to just pass the test
        expect { subject }.to raise_error NoMethodError
        expect { subject }.to raise_error ActiveRecord::RecordInvalid
      end
    end
  end
end

Я получаю ошибку ниже, когда читаю изображение ошибка. какое правильное двойное значение мне нужно, чтобы оно работало.

Failures:

  1) ImagesService.save_image save image throws error raised the error
     Failure/Error: expect { subject }.to raise_error ActiveRecord::RecordInvalid
     
       expected ActiveRecord::RecordInvalid, got #<NoMethodError: undefined method `messages' for {:messages=>{:name=>["is invalid", "must be implemented"]}}:Hash> with backtrace:

1 Ответ

0 голосов
/ 12 июля 2020

В этом случае причина, по которой вы не получаете исключение при вызове subject, заключается в том, что он не вызывает исключения. Поскольку вы установили блок спасения в save_image, если внутри него возникнет исключение, будет вызван блок спасения, и исключение не будет передано вызывающей стороне, вместо этого будет вызываться image_processing_error.

Итак, в вашем spe c, когда вы вызываете subject, вы не получите исключения, но вместо этого вы получите проанализированные ошибки из image_processing_error, которые, как я понимаю, на самом деле являются ожидаемое поведение.

В этом случае вы могли бы проверить, что результат, который вы получаете от subject, соответствует ожидаемому сообщению об ошибке, которое вы получите в этом случае, например:

it "returns the error messages" do
    expect(response.body).to include("is invalid", "must be implemented")
end
...