Как можно дразнить/блокировать модуль Python как urllib

Вы можете использовать pd.Series.isin .

Для «IN» используйте: something.isin(somewhere)

Или для «NOT IN»: ~something.isin(somewhere)

В качестве обработанного примера:

>>> df
  countries
0        US
1        UK
2   Germany
3     China
>>> countries
['UK', 'China']
>>> df.countries.isin(countries)
0    False
1     True
2    False
3     True
Name: countries, dtype: bool
>>> df[df.countries.isin(countries)]
  countries
1        UK
3     China
>>> df[~df.countries.isin(countries)]
  countries
0        US
2   Germany

65
задан Dinoboff 17 November 2008 в 14:47
поделиться

5 ответов

Другой простой подход должен иметь Ваш тестовый urllib's переопределения urlopen() функция. Например, если Ваш модуль имеет

import urllib

def some_function_that_uses_urllib():
    ...
    urllib.urlopen()
    ...

, Вы могли бы определить свой тест как это:

import mymodule

def dummy_urlopen(url):
    ...

mymodule.urllib.urlopen = dummy_urlopen

Затем то, когда Ваши тесты вызовут функции в mymodule, dummy_urlopen(), назовут вместо реального urlopen(). Динамические языки как Python делают супер легким погасить методы и классы для тестирования.

Посмотрите мои сообщения в блоге в http://softwarecorner.wordpress.com/ для получения дополнительной информации о гашении зависимостей для тестов.

95
ответ дан user 7 November 2019 в 11:22
поделиться

Вы давали Mox взгляд? Это должно сделать все, в чем Вы нуждаетесь. Вот простая интерактивная сессия, иллюстрирующая решение, в котором Вы нуждаетесь:

>>> import urllib
>>> # check that it works
>>> urllib.urlopen('http://www.google.com/')
<addinfourl at 3082723820L ...>
>>> # check what happens when it doesn't
>>> urllib.urlopen('http://hopefully.doesnotexist.com/')
#-- snip --
IOError: [Errno socket error] (-2, 'Name or service not known')

>>> # OK, let's mock it up
>>> import mox
>>> m = mox.Mox()
>>> m.StubOutWithMock(urllib, 'urlopen')
>>> # We can be verbose if we want to :)
>>> urllib.urlopen(mox.IgnoreArg()).AndRaise(
...   IOError('socket error', (-2, 'Name or service not known')))

>>> # Let's check if it works
>>> m.ReplayAll()
>>> urllib.urlopen('http://www.google.com/')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/site-packages/mox.py", line 568, in __call__
    raise expected_method._exception
IOError: [Errno socket error] (-2, 'Name or service not known')

>>> # yay! now unset everything
>>> m.UnsetStubs()
>>> m.VerifyAll()
>>> # and check that it still works
>>> urllib.urlopen('http://www.google.com/')
<addinfourl at 3076773548L ...>
27
ответ дан Romuald Brunet 7 November 2019 в 11:22
поделиться

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

Тогда передают экземпляр кода устройства выбора в логику обработки, тогда можно легко заменить его ложным устройством выбора для модульного теста.

, например,

class Processor(oject):
    def __init__(self, fetcher):
        self.m_fetcher = fetcher

    def doProcessing(self):
        ## use self.m_fetcher to get page contents

class RealFetcher(object):
    def fetchPage(self, url):
        ## get real contents

class FakeFetcher(object):
    def fetchPage(self, url):
        ## Return whatever fake contents are required for this test
8
ответ дан Douglas Leeder 7 November 2019 в 11:22
поделиться

Самый простой путь состоит в том, чтобы изменить Вашу функцию так, чтобы это не обязательно использовало urllib.urlopen. Скажем, это - Ваша исходная функция:

def my_grabber(arg1, arg2, arg3):
    # .. do some stuff ..
    url = make_url_somehow()
    data = urllib.urlopen(url)
    # .. do something with data ..
    return answer

Добавляют аргумент, который является функцией для использования для открытия URL. Тогда можно обеспечить ложную функцию, чтобы сделать независимо от того, что Вам нужно:

def my_grabber(arg1, arg2, arg3, urlopen=urllib.urlopen):
    # .. do some stuff ..
    url = make_url_somehow()
    data = urlopen(url)
    # .. do something with data ..
    return answer

def test_my_grabber():
    my_grabber(arg1, arg2, arg3, urlopen=my_mock_open)
3
ответ дан Ned Batchelder 7 November 2019 в 11:22
поделиться

Я использую декоратор патчей Mock's :

from mock import patch

[...]

@patch('urllib.urlopen')
def test_foo(self, urlopen_mock):
    urlopen_mock.return_value = MyUrlOpenMock()
68
ответ дан 24 November 2019 в 14:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: