Юнит тест на выскабливание подписчиков Instagram - PullRequest
1 голос
/ 21 мая 2019

Новое на ruby ​​/ rails и в настоящее время в процессе изучения и написания спецификаций.У меня есть эти два метода для очистки подписчиков Instagram

def instagram_scraped_followers_count(instagram_username)
        url = "https://www.instagram.com/#{ CGI::escape(instagram_username) }/"
        body = HTTParty.get(url)

        match = body.match(/(?<=content\=")(?<count>\d+[,.]?\d*)(?<unit>[km])?(?=\sFollowers)/) if body
        match['count'].to_f * instagram_multiplier(match['unit']) if match
      end

      def instagram_multiplier(unit)
        case unit
        when 'm' then 1_000_000
        when 'k' then 1_000
        else 1
        end
      end

и я добавил для этого юнит-тест, как показано ниже:

  context '1,300 followers' do
    let(:html_body) { '<meta content="1,300 Followers, 1,408 Following, 395 Posts' }

    it 'returns 1,300' do
      expect(subject.stats[:instagram]).to eql(1_300.0)
    end
  end

Мой юнит-тест не пройден из-за этого context '1,300 followers' do иошибка говорит о том, что expected: 1300.0 got: 1.0 Что я пропустил?Это потому, что в instagram_multiplier методе нет условий для этого?

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

match[:count].to_f из 1,300 возврат 1.

Я бы предложил вам изменить его на match[:count].gsub(',', '').to_f, где вы заменяете , ничем, а затем выполняете .to_f

def instagram_scraped_followers_count(instagram_username)
  url = "https://www.instagram.com/#{ CGI::escape(instagram_username) }/"
  body = HTTParty.get(url)

  match = body.match(/(?<=content\=")(?<count>\d+[,.]?\d*)(?<unit>[km])?(?=\sFollowers)/) if body
  match['count'].gsub(',', '').to_f * instagram_multiplier(match['unit']) if match
end

def instagram_multiplier(unit)
  case unit
  when 'm' then 1_000_000
  when 'k' then 1_000
  else 1
  end
end
2 голосов
/ 21 мая 2019

Если вы хотите смоделировать HTTP-вызовы, я предлагаю вам использовать webmock , драгоценный камень, приспособленный для этого варианта использования.

Это позволит вам написать что-то вроде:

let(:instagram_username) { 'whatever' }
let(:body) { '...' }

before do
  stub_request(:get, 'https://www.instragram.com/whatever/').and_return(body: body)
end

Дополнительные соображения

Instagram предоставляет разработчикам API .Возможно, вы захотите использовать это вместо синтаксического анализа HTML-документа с регулярным выражением .

Может даже существовать гем, который делает Ruby тяжелым для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...