我使用优秀的书籍(Test Driven Development in Python)在Python上发现了TDD,到目前为止,我很享受。
但是,我对你创建单元测试的方式提出了疑问。
让我们想象一下这样的事情:
def A(MyObject):
# Do some complex modification on MyObject
return modified_MyObject
def B(modified_MyObject):
# Do some stuff on modified_MyObject
return something
如果我想测试A,它将非常简单:我将在我的单元测试中手动创建一个对象,并测试它,如下所示:
class TestObject(unittest.TestCase):
def testA(self):
testA = MyObject()
modified_MyObject = A(testA)
# assert MyObject has been modified
但是,如何测试B? 我可以看到:
第一种方法允许testB不依赖于A(),但我会创建一个“常量”对象,这显然是在TDD中要避免的。此外,如果我在代码中更改了某些内容,我还必须修改我创建的对象。最后,如果对我的对象进行的修改意味着数百个步骤/数据,那么手动创建对象可能会非常痛苦。
第二种方法是在A()和A之间建立一种依赖关系。 testB,但是我正在测试A(),它应该没问题。
def testB(self):
testA = MyObject()
testModifiedObject = A(testA)
result = B(testModifiedObject)
# assert that B return a correct result.
一般问题可能是:“在TDD中,如果代码函数正在使用其他函数,我可以在单元测试中使用它们吗?”
感谢您的帮助,
答案 0 :(得分:0)
我认为你的问题太笼统了,你能举个具体的例子吗?根据对象和关系,答案会有所不同。
一般情况下,是的,您可以使用其他功能(只要这些功能有自己的测试)。通常,您可以使用setUp
方法执行此操作:
def setUp(self):
self.modified_object = A(object())
def testB(self):
result = B(self.modified_object)
# assert something
有时候你可能想要一个模拟对象或只是将一些虚拟对象传递给B.这一切都取决于。
是的,你知道object()
创建的对象是不可变的,你不能修改它吗?