在python中组合断言

在python中组合断言,python,unit-testing,Python,Unit Testing,我有一个这样的测试用例: class TokenGeneratorTestCase(unittest.TestCase): def test_genToken(self): """ Test if genToken returns a UUID, if not, then -1 """ tg = TokenGenerator()

我有一个这样的测试用例:

class TokenGeneratorTestCase(unittest.TestCase):

        def test_genToken(self):
                """
                Test if genToken returns a UUID, if not, then -1
                """
                tg = TokenGenerator()
                result = tg.genToken()
                self.assertIn(type(result), [ uuid.UUID, int ])
                if type(result) == int:
                        self.assertEqual(result, -1)
我想测试genToken()是否返回uuid.uuid或-1。是否可以使用单个断言*


PS:我对Python和单元测试都是新手,所以请原谅我的无知:)

在您进行两次断言时没有什么错(假设您捕获了
AssertionError
:)。不过,如果您愿意,您可以将它们组合在一起,如:

# You can also use type(result) == uuid.UUID or result == -1
correctness = isinstance(result, uuid.UUID) or (isinstance(result, int) and result == -1)
self.assertTrue(correctness)

您在这里遇到了问题-因为您无法确定
TokenGenerator
是否正常工作。它总是可以返回
-1
,您会很高兴测试通过了。您需要在此处创建两个测试—一个验证生成器返回
-1
,另一个验证生成器返回
uuid.uuid
。这些测试应该是可重复的,而不是随机的。你怎么能做到?您应该能够从测试中影响令牌生成器中的
someCondition
。也就是说,在调用
genToken()
之前,您应该向生成器传递一些依赖项,或者设置适当的生成器状态

getToken()
完全是随机工作的吗?或者生成的值取决于某些条件?def genToken:if(someCondition):return-1 else:return uuid.uuid1()'someCondition'=isDiskSpaceAvailable()。我如何影响它?@iceman您可以创建一些类,如
Environment
,该类将具有方法
isdiskspaceavable()
,并将此环境对象传递给令牌生成器。这将允许您模拟
环境
类,并为
isDisckSpaceAvailable()
方法提供您自己的结果。事实上,我认为令牌生成器的责任是生成令牌,而不是检查您机器上的磁盘空间。谢谢您的澄清。但是,如果genToken()是isDiskSpaceAvailable()的唯一消费者该怎么办呢。然后创建一个单独的类是否合理?@iceman您应该创建类来将强相关的代码分组在一起(即类应该有)-这就是创建类的原因。这个阶层会有多少消费者并不重要。好的OOP设计通常会产生许多专注于特定对象的小类responsibilities@iceman还有一点——单元测试应该独立于其他类和环境来测试类()