测试实际功能还是模拟unittest的依赖?

时间:2015-09-06 09:58:32

标签: python unit-testing

鉴于以下功能:

def _extract_row(self, rnumber, rcontent):
    number = rnumber.find('p').text.strip()
    p = rcontent.find('p')
    dloms = p.find_all('a')

    docs = {}
    for d in dloms:
        docs[d.text.strip()] = DOMAIN + d['href']

    ems = p.find_all('em')
    for e in ems:
        name = e.text.strip()
        if not docs.get(name):
            docs[name] = None

    ldocs = []
    for name, link in docs.iteritems():
        ldocs.append({'name': name,
                      'link': link})

    return {'number': number,
            'docs': ldocs}

其中rnumber和rcontent是BS4或Beautifulsoup对象,安装BS4作为测试依赖项并正常测试函数或模拟BS4更好吗?

这是我做的:

@patch("agc_law.bs4.BeautifulSoup")
def test_law_pages_private_extract_row(self, mock_bs4):

    """Test asserting correct calls are made in _extract_row"""

    agc_law.DOMAIN = "http://example.com"
    mock_rnumber = mock_bs4
    mock_rcontent = mock_bs4

    result = self.lp._extract_row(mock_rnumber, mock_rcontent)
    for item in [call.find('p'),
                 call.find().text.strip(),
                 call.find('p'),
                 call.find().find_all('a'),
                 call.find().find_all('em')]:
        self.assertIn(item, mock_rcontent.mock_calls)

    for item in [call.find('p'),
                 call.find().text.strip(),
                 call.find('p'),
                 call.find().find_all('a'),
                 call.find().find_all('em')]:
        self.assertIn(item, mock_rnumber.mock_calls)

会重视评论。

1 个答案:

答案 0 :(得分:0)

您的代码与BeautifulSoup和正在解析的文档紧密耦合。如果您的文档结构发生变化,您将不得不重构您的测试代码和测试。

此外,如果您要找到一种更有效的方式来使用BeautifulSoup(例如,通过使用CSS选择器),您无法在不再完全改变测试以匹配的情况下重构被测试代码。 / p>

在这种情况下你也可以使用真实的文件来反映当前的结构;这样你就可以测试你的代码的结果,而不是它如何实现结果。