0

以下 pytest-test 使用 httpretty 来模拟请求。它将获取的数据写入文件:

import requests
import httpretty
import json
from os import listdir
from os.path import join

@httpretty.activate
def test_write_file_from_datasource():
    tmpdir = './mytestdir'

    # mock the connection
    concert_url = 'http://apis.is/concerts'
    httpretty.register_uri(httpretty.GET, concert_url,
                           body = json.dumps({'results': []}),
                           content_type='application/json')
    # fetch data
    concerts = requests.get(concert_url).json()

    # write data
    with open(join(tmpdir, 'concerts.json'), 'w') as json_data:
        json.dump(concerts, json_data, indent=2)

    assert len(listdir(tmpdir)) == 1

我现在想做的是利用pytest tmpdir功能。为了达到这个目的,我写了一个这样的测试(导入与上面相同):

@httpretty.activate
def test_write_file_from_datasource_failing(tmpdir):
    tmpdir = str(tmpdir)
    # mock the connection
    concert_url = 'http://apis.is/concerts'
    httpretty.register_uri(httpretty.GET, concert_url,
                           body = json.dumps({'results': []}),
                           content_type='application/json')
    # fetch data
    concerts = requests.get(concert_url).json()

    # write data
    with open(join(tmpdir, 'concerts.json'), 'w') as json_data:
        json.dump(concerts, json_data, indent=2)

    assert len(listdir(tmpdir)) == 1

它失败了,因为 httpretty 装饰器似乎有附加参数的问题:

TypeError: test_write_file_from_datasource_failing() takes exactly 1 argument (0 given)

任何想法如何解决这一问题?

4

1 回答 1

1

看来这个装饰器不适用于 pytest 的 funcargs。

我看到的唯一解决方案是手动调用httprertty.enable()httpretty.disable()方法。

或者创建一个夹具:

@pytest.yield_fixture
def http_pretty_mock():
    httpretty.enable()
    yield
    httpretty.disable()


def test_write_file_from_datasource_failing(http_pretty_mock, tmpdir):
    tmpdir = str(tmpdir)
    # mock the connection
于 2015-05-03T11:33:00.313 回答