如何在单元测试中替换__init__方法中的默认参数

时间:2017-02-07 02:41:40

标签: python

我有一个正在测试的类,它在__init__中公开了一个参数,仅用于测试。看起来像这样

class MyClass(object):
  def __init__(self, start_time=None):
    if start_time is None:
      start_time = time.time()

在我的测试中,我想使用假时间传递start_time,所以我首先在setUp()中获得时间,然后将其传递给每个测试方法。

class MyclassTest(TestCase):
  def setUp(self):
    self.fake_start_time = time.time()

  def test_one(self):
    x = MyClass(start_time=self.fake_start_time)
    ...

  def test_two(self):
    x = MyClass(start_time=self.fake_start_time)
    ...

这一切都有效,但我想知道是否有办法避免在每次测试中都写start_time=self.fake_start_time。我可以以某种方式替换__init__setUp()方法的默认参数吗?

我想出了一个丑陋的方法,但想知道是否有更标准的方法,可能基于mock.patch

2 个答案:

答案 0 :(得分:1)

setUp中创建一个类的实例:

def setUp(self)
    self.fake_start_time = time.time()
    self.x = MyClass(start_time=self.fake_start_time)

答案 1 :(得分:1)

functools.partial可用于预绑定参数。因此,在这种情况下,您可以将时间绑定到类构造函数,然后使用绑定的构造函数而不传递其他参数:

from functools import partial

class MyclassTest(TestCase):
  def setUp(self):
    # Feel free to use a shorter name
    self.FakeTimeMyClass = partial(MyClass, time.time())

  def test_one(self):
    x = self.FakeTimeMyClass()
    ...

  def test_two(self):
    x = self.FakeTimeMyClass()
    ...