Rspec для тестирования визуализированного шаблона вне контроллера / представления - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть ситуация для рендеринга шаблона HTML вне контроллера (класс в каталоге service / lib), и я рендеринг шаблона с использованием приведенного ниже кода.

class SomeClass
   def some_method
      @template = ApplicationController.render(
            template: 'template',
            layout: mailer_template,
        )
   end
end

Есть ли способы проверитьесли визуализированный шаблон является ожидаемым и произошел ли рендеринг во время вызова этого метода?

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

class BatchSendingService < AbstractController::Base

    require 'abstract_controller'

    include AbstractController::Rendering
    include AbstractController::AssetPaths
    include AbstractController::Helpers
    include Rails.application.routes.url_helpers


    include ActionView::Rendering
    include ActionView::ViewPaths
    include ActionView::Layouts
    self.view_paths = "app/views"

    def send_batch_email(mail, domain)
       @project = mail.project
       @client = Mailgun::Client.new ENV['MAILGUN_API_KEY']
       batch_message = Mailgun::BatchMessage.new(@client, domain)
       batch_message.from(from_data)

       mailer_layout = get_mailer_layout(mail.layout)
       mail_html = render(
          template: 'send_batch_email',
          layout: mailer_layout
      )

       batch_message.body_html(mail_html.to_s)

      batch_message.add_recipient(:to, recipient_email, {})
      response = batch_message.finalize 
   end

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

obj= BatchSendingService.new allow(obj).to receive(:render) BatchSendingService.send_batch_email(mail, domain) expect(obj) .to have_received(:render) .with({ template: "template", layout: "layout" })

При использовании класса, где вызывается метод экземпляра, ошибка исчезла.

1 Ответ

0 голосов
/ 06 декабря 2018

ActionController.render - это хорошо проверенный метод.Основная команда Rails позаботилась об этом.Нет необходимости проверять, что он делает то, что говорит.

Скорее, вам нужно убедиться, что вы вызвали ActionController.render с правильными параметрами, используя фиктивные объекты, например:

describe SomeClass do
  subject(:some_class) { described_class.new }

  describe '#some_method' do
    let(:template) { 'template' }
    let(:layout) { 'mailer_template' }

    before do
      allow(ActionController).to receive(:render)

      some_class.some_method
    end

    it 'renders the correct template' do
      expect(ActionController)
        .to have_received(:render)
        .with({ template: template, layout: layout })
    end
  end
end

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

Учитывая отредактированный пост, вот как я подхожу к тесту.Обратите внимание, что не весь код в вашем методе send_batch_email виден при редактировании.Итак, YMMV:

describe BatchSendingService do
  subject(:batch_sending_service) { described_class.new }

  describe '#send_batch_email' do
    subject(:send_batch_email) do 
      batch_sending_service.send_batch_email(email, domain)
    end

    let(:email) { 'email' }
    let(:domain) { 'domain' }
    let(:batch_message) do
      instance_double(
        Mailgun::BatchMessage, 
        from: true,
        body_html: true,
        add_recipient, true,
        finalize: true
      )
    end
    let(:template) { 'send_batch_template' }
    let(:layout) { 'layout' }

    before do
      allow(Mailgun::Client).to receive(:new)
      allow(Mailgun::BatchMessage)
        .to receive(:new)
        .and_return(batch_message)
      allow(batch_sending_service)
        .to receive(:render)

      send_batch_email
    end

    it 'renders the correct template' do
      expect(batch_sending_service)
        .to have_received(:render)
        .with(template, layout)
    end
  end
end
...