我真的试图开始隔离我的单元测试,这样我就可以确定错误发生的位置,而不是在出现问题时让整个屏幕变为红色。除了初始化程序中的某些内容失败之外,它一直在所有实例中工作。
查看这些测试:
@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)
有没有办法隔离或模拟初始化器或对象构造函数?
答案 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)
您可能还想重新考虑如何设置测试。如果你必须为每个测试重新创建两个文件,也许问问自己为什么。您的测试是否可以设置为设置两个文件,然后运行一系列测试,冲洗并重复。这样做只会使分配给该路径的一系列测试失败,从而帮助您找出它失败的原因。