5

我真的试图开始隔离我的单元测试,以便我可以查明发生错误的位置,而不是在出现问题时让整个屏幕变红并出现故障。它在所有情况下都有效,除非初始化程序中的某些内容失败。

看看这些测试:

@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)

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

4

2 回答 2

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

于 2013-10-29T21:00:02.167 回答
0

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

您可以做的另一件事是简单地模拟其返回值,而不是模拟对象构造函数。即:给定这个输入,我期望这个输出——所以无论它是否正确返回,我都将使用这个预期的输出。

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

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

于 2013-10-18T19:56:57.960 回答