Python 机头测试生成器类内

Python 机头测试生成器类内,python,generator,nose,Python,Generator,Nose,可以在自定义类中运行前端测试生成器吗?我正在尝试将转换为简单的基于类的版本: file: trial.py >>>>>>>>>>>>>> class ATest(): def test_evens(self): for i in range(0, 5): yield self.check_even, i, i * 3 def check_even(self

可以在自定义类中运行前端测试生成器吗?我正在尝试将转换为简单的基于类的版本:

file: trial.py
>>>>>>>>>>>>>>
class ATest():
    def test_evens(self):
        for i in range(0, 5):
            yield self.check_even, i, i * 3

    def check_even(self, n, nn):
        assert n % 2 == 0 or nn % 2 == 0
这导致

$ nosetests -v trial.py
----------------------------------------------------------------------
Ran 0 tests in 0.000s
我看了一下变更日志,认为这个版本应该可以运行


我哪里出错了?

我相信您必须将unittest.TestCase子类化

import unittest

class ATest(unittest.TestCase):
    def test_evens(self):
        for i in range(0, 5):
            yield self.check_even, i, i * 3

    def check_even(self, n, nn):
        assert n % 2 == 0 or nn % 2 == 0

解决方案是不太期望的:不要从
unittest.TestCase
子类化,以便让nosetests发现生成器方法。使用NoTests 1.1.3的代码(GitHub的最新版本):

另外,使用
TestA
代替
ATest

test.py:2: TestA.test_evens[0] PASSED
test.py:2: TestA.test_evens[1] FAILED
test.py:2: TestA.test_evens[2] PASSED
test.py:2: TestA.test_evens[3] FAILED
test.py:2: TestA.test_evens[4] PASSED

请参见Andrés的回答-
nose
无法运行生成器测试,因为创建它们的方法属于
unittest.TestCase
的子类。如果您正在考虑将TestCase类子类化,那么它们不是为子类化而设计的,并且您会看到测试运行程序之间的行为差异。这太糟糕了;如果能够使用unittest的assertRaisesRegexp,那就太好了:/@ChrisR:您可以使用
nose.tools.assert\u raises\u regexp
来补充这个答案,nose现在记录这个行为。“请注意,unittest.TestCase子类中不支持方法生成器。”
test.py:2: TestA.test_evens[0] PASSED
test.py:2: TestA.test_evens[1] FAILED
test.py:2: TestA.test_evens[2] PASSED
test.py:2: TestA.test_evens[3] FAILED
test.py:2: TestA.test_evens[4] PASSED