隔离依赖于初始化程序的测试的好方法

时间:2013-10-18 18:10:46

标签: python unit-testing testing mocking

我真的试图开始隔离我的单元测试,这样我就可以确定错误发生的位置,而不是在出现问题时让整个屏幕变为红色。除了初始化程序中的某些内容失败之外,它一直在所有实例中工作。

查看这些测试:

@setup_directory(test_path)
def test_filename(self):
  flexmock(lib.utility.time).should_receive('timestamp_with_random').and_return(1234)

  f = SomeFiles(self.test_path)
  assert f.path == os.path.join(self.test_path, '1234.db')

@setup_directory(test_path)
def test_filename_with_suffix(self):
  flexmock(lib.utility.time).should_receive('timestamp_with_random').and_return(1234)

  f = SomeFiles(self.test_path, suffix='.txt')
  assert f.path == os.path.join(self.test_path, '1234.txt')

我正在嘲笑依赖方法,以便我正在测试的东西是完全孤立的。您注意到的是,需要为每个测试实例化该类。 如果初始化程序中引入了错误,则每次测试都会失败。

这是调用类的初始值设定项的违规构造函数:

SomeFiles(*args)

有没有办法隔离或模拟初始化器或对象构造函数?

2 个答案:

答案 0 :(得分:1)

我不确定您正在使用哪些测试包,但一般情况下,您通常可以在实际尝试使用它之前模拟该类的__init__()调用。像

这样的东西
def my_init_mock_fn(*args, **kwargs):
    print 'mock_init'

SomeFiles.__init__ = my_init_mock_fn
SomeFiles()

这可能不是你想要的,因为从SomeFiles.__init__开始fn将始终是模拟fn,但是像voidspace mock这样的实用程序提供了一个补丁功能,允许你修补该课程仅针对特定范围。

from mock import patch
with patch.object(SomeFiles, '__init__', my_init_mock_fn):
    SomeFiles()
    ..other various tests...
SomeFiles() #__init__ is reset to original __init__ fn

我确信在您使用的任何模拟包中可能存在类似的功能。

刚刚意识到你正在使用flexmock,有replace_with here.的页面

答案 1 :(得分:0)

导致初始化功能失败的原因是什么?也许这是你应该研究的一个错误。

你可以做的另一件事,而不是模拟对象构造函数,只是模拟它的返回值。即:给定这个输入,我期待这个输出 - 所以我将使用这个预期的输出,无论它是否正确返回。

您也可以在第一次失败时停止测试。 (failfast

您可能还想重新考虑如何设置测试。如果你必须为每个测试重新创建两个文件,也许问问自己为什么。您的测试是否可以设置为设置两个文件,然后运行一系列测试,冲洗并重复。这样做只会使分配给该路径的一系列测试失败,从而帮助您找出它失败的原因。