Обезьяна исправляет с макетом в блок - PullRequest
0 голосов
/ 23 апреля 2020

Вот что получилось:

# lib file
module SlackWrapper
  class << self
    def client
      @client ||= ::Slack::Web::Client.new
    end
  end
end

describe SlackWrapper do
  # test file
  before :each do
    $mock_client = double("slack client").tap do |mock|
      allow(mock).to receive(:channels_info) { channel_info }
    end

    module SlackWrapper
      class << self
        def client
          $mock_client
        end
      end
    end
  end

  describe "#should_reply?" do
    describe "while channel is paused" do
      it "is falsey" do
        SlackWrapper.pause_channel message.channel

        expect(
          SlackWrapper.should_reply? message
        ).to be_falsey
      end
    end

    describe "while channel is not paused" do
      it "is truthy" do
        expect(
          SlackWrapper.should_reply? message
        ).to be_truthy
      end
    end
  end
end

Это определенно не кажется правильным. Однако, оставляя $mock_client в качестве локальной переменной, я получаю undefined local variable при выполнении тестов, а перемещение кода double... в monkeypatch дает undefined method. И конечно же, обезьяноподготовка.

Как правильно это сделать?

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете просто заглушка метод new для тестового блока или всего файла spe c:

# test file

# you could also create a class double if you need its methods:
# https://relishapp.com/rspec/rspec-mocks/v/3-9/docs/verifying-doubles/using-a-class-double
let(:slack_client) { double("slack client") }

before(:each) do
  allow(::Slack::Web::Client).to receive(:new).and_return(slack_client)
end

# simple example:
it "checks slack client method to be a double" do
  expect(SlackWrapper.client).to be(slack_client)
end
...