2

我最近了解了单元测试,并且知道您不应该对外部资源进行单元测试。因此,这导致我遇到一个问题,即测试一个我想重写为单元测试标准的简单函数。

为简单起见,下面是该函数的一个示例:

def longTask(somearg):
  # Check somearg

  # Begin infinite loop
    # Check remote resource loop based on somearg

    # Write results to a database or file

    # Check to break loop

  # Cleanup upon end

我想确保上面的代码已经过单元测试(现在我知道单元测试)。

我的主要困惑来自这样一个事实:当您不应该对外部资源进行单元测试时,我如何才能对进行外部资源调用的简单函数进行单元测试?

注意:我已经在 SO 上阅读了关于此的其他帖子,但这些帖子并没有回答我的问题。

4

2 回答 2

4
My main confusion comes from the fact of how can I unit test 
simple functions that are making external resource
calls when you aren't supposed to unit test external resources?

在这种情况下,我通常会使用某种模拟。有一些优秀的 Python 模拟包,例如http://www.voidspace.org.uk/python/mock,它们使测试对象对真实对象的这种替换变得更加容易

例如

    def test_au(self):
        user_id=124
        def apple(req):
            return 104
        with patch('pyramid.security.authenticated_userid', return_value=user_id
):
            authenticated_userid = apple
            self.assertEqual("104", authenticated_userid(self.request).__str__()
)

patch 是从 mock 导入的方法。它会在给定的范围内改变其他包的行为。

在此示例中,authenticated_userid 的预定义库方法与from pyramid.security import authenticated_userid金字塔框架一起导入并在其中工作。为了在我的设置函数运行后测试它是否返回正确的值,我可以在测试期间“覆盖”该方法

于 2013-09-16T08:50:12.083 回答
2

您是否考虑过使用 Fake 对象 [1] 之类的东西来测试您的代码。您可以为外部资源和您的测试提供一个包装器/接口,使用该包装器/接口的一个版本,该版本提供了便于测试的行为。

[1] https://en.wikipedia.org/wiki/Mock_object#Mocks.2C_fakes_and_stubs

于 2013-09-16T08:49:00.610 回答