Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获得一个python函数内部的值,该函数对单元测试不返回任何结果?_Python_Unit Testing - Fatal编程技术网

如何获得一个python函数内部的值,该函数对单元测试不返回任何结果?

如何获得一个python函数内部的值,该函数对单元测试不返回任何结果?,python,unit-testing,Python,Unit Testing,我正在尝试为现有函数编写单元测试: def _fetch_law(self, task, storage): number, link = task if not self.silent: print 'Requesting page %s' % number r = requests.get(link, headers=self.headers) if r.status_code != 200: sys.exit('CONNEC

我正在尝试为现有函数编写单元测试:

def _fetch_law(self, task, storage):
    number, link = task
    if not self.silent:
        print 'Requesting page %s' % number
    r = requests.get(link, headers=self.headers)

    if r.status_code != 200:
        sys.exit('CONNECTION ERROR!!! HTTP ERROR %d' % r.status_code)
    vs = LawPages(r.text)
    storage.extend(vs.extract())

对于我的单元测试,我如何使用模拟或其他方法来获得传递到存储的最终值

当您将
存储
传递给函数时,为什么不创建一个传递的空列表呢。该函数将附加到
存储
,然后您可以检查该列表中的内容以及它是否是预期结果。

我通常使用
mock
库(
unittest.mock
在python3.x中)。它看起来像:

mock_storage = mock.Mock()
obj._fetch_law(some_task, mock_storage)
mock_storage.extend.assert_called_with(expected_value)
当然,在本例中,您可能还希望模拟请求<代码>模拟.补丁非常适合:

with mock.patch.object(requests, 'get') as mock_get:
    mock_get.return_value = ' ... '
    mock_storage = mock.Mock()
    obj._fetch_law(some_task, mock_storage)
    mock_storage.extend.assert_called_with(expected_value)

劳伦斯是对的,只要做一些简单的事情,比如:

def test_fetch_law():
    store = []
    task = ...
    cls = ClassWithFetchLaw()
    cls._fetch_law(task, store)
    assert len(store) > 0
另一方面,如果要进行单元测试,为什么不让sys.exit抛出一个异常并为其编写另一个测试呢?除非你真的想让sys.exit在那里

def test_fetch_law_throws():
    store = []
    bad_task = ...
    cls = ClassWithFetchLaw()
    with pytest.raises(Exception):
        cls._fetch_law(bad_task, store)

这取决于返回值的类型
vs.extract
——它必须是可编辑的(注意,函数使用的是
extend
,而不是
append
)。@mgilson我看不出问题所在。如果列表为空,然后由该函数填充,则列表中的所有数据必须来自该列表。因为我们不知道这些数据是什么样子的,所以很难指定如何check@mgilson这是正确的,但是函数用
extend()
定义它,所以如果它不可编辑,代码将失败。但是如果一个问题与测试某个东西是否被写入一个列表不同,该列表严重依赖于对象
存储
<代码>存储。扩展可以处理不可编辑的数据。如前所述,由于我们对将要传递的存储对象一无所知,所以这个问题没有明确说明。如果OP的用例实际上使用了一个类似列表的对象,那么我同意——使用一个
列表
:-)。啊,我现在知道你从哪里来了。是的,在这种情况下,我只是假设存储是一个列表;)