RSpe c сбой в POST с ошибкой: сбой / ошибка не реализуется: вызов - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь протестировать конечную точку метода postMessage из Slack API, которая отвечает за отправку сообщений в Slack.

Как видите, это простые запросы HTTPost:

module Slack
  class Messenger
    def initialize(event)
      @event = event
    end

    def call
      HTTParty.post('https://slack.com/api/chat.postMessage', body: params, headers: headers)
    end

    private

    attr_reader :event

    def params
      {
        token: Settings.slack_token,
        channel: Slack::GetUserId.new(parsed_email).call,
        text: Slack::ReporterTextMessage.new(parsed_name, parsed_ticket_number).call,
        as_user: true
      }
    end
#here are methods: parsed_email, parsed_name, parsed_ticket_number

Итак, я сделал тест на RSpe c:

RSpec.describe Slack::Messenger do
  subject { described_class.new(event) }
  let(:event) { File.new('./spec/support/events/event.json').read }

  describe 'call' do
    let(:valid_params) do
      {
        token: 'token',
        channel: '12345',
        text: 'This is a message',
        as_user: true
      }
    end
    let(:response) { subject.call }
    before do
      allow(HTTParty).to receive(:post).and_return(valid_params)
    end

    it "returns specific params" do
      allow_any_instance_of(Slack::SlackMessenger).to receive(:call).and_return(valid_params)
      expect(response).to receive(:call).with(valid_params)
    end
  end
end

Где-то у меня пародия отстой, потому что я получаю сообщение об ошибке:

 Failure/Error: expect(response).to receive(:call).with(valid_params)
   {:token=>"token", :channel=>"12345", :text=>"This is a message", :as_user=>true} does not implement: call

РЕДАКТИРОВАТЬ: после насмешки я получаю ошибку:

1) Slack::SlackMessenger call call HTTParty
   Failure/Error: subject.call

   TypeError:
     no implicit conversion of nil into String
   # /Users/usr/.rvm/gems/ruby-2.5.0/gems/json-2.2.0/lib/json/common.rb:156:in `initialize'
   # /Users/usr/.rvm/gems/ruby-2.5.0/gems/json-2.2.0/lib/json/common.rb:156:in `new'
   # /Users/usr/.rvm/gems/ruby-2.5.0/gems/json-2.2.0/lib/json/common.rb:156:in `parse'
   # ./source/parsers/jira_parser.rb:9:in `initialize'
   # ./source/slack/messenger.rb:30:in `new'
   # ./source/slack/messenger.rb:30:in `parsed_email'
   # ./source/slack/messenger.rb:23:in `params'
   # ./source/slack/messenger.rb:13:in `call'
   # ./spec/source/slack/messenger_spec.rb:56:in `block (3 levels) in <top (required)>'

1 Ответ

0 голосов
/ 12 февраля 2020

Я думаю, это должно выглядеть так:

RSpec.describe Slack::Messenger do
  subject { described_class.new(event) }
  let(:event) { File.new('./spec/support/events/event.json').read }

  describe 'call' do
    before do
      allow(HTTParty).to receive(:post).with(any_args)
    end

    it "call HTTParty" do
      subject.call
      expect(HTTParty).to have_received(:post)
    end
  end
end

Но я рекомендую заглушить эти параметры:

def params
  {
    token: Settings.slack_token,
    channel: Slack::GetUserId.new(parsed_email).call,
    text: Slack::ReporterTextMessage.new(parsed_name, parsed_ticket_number).call,
    as_user: true
  }
end

Чтобы это выглядело как:

RSpec.describe Slack::Messenger do
  subject { described_class.new(event) }
  let(:event) { File.new('./spec/support/events/event.json').read }

  describe 'call' do
    let(:slack_url) { 'https://slack.com/api/chat.postMessage' }
    let(:valid_params) do
      {
        token: 'token',
        channel: '12345',
        text: 'This is a message',
        as_user: true
      }
    end

    before do
      allow(Settings).to receive(:slack_token).and_return(valid_params[:token])
      ...
      allow(HTTParty).to receive(:post).with(slack_url, body: valid_params, header: ..)
    end

    it "call HTTParty with valid params" do
      subject.call
      expect(HTTParty).to have_received(:post).with(slack_url, body: valid_params, header: ..)
    end
  end
end
...