2011-07-14 34 views
18

是否可以在自定义类中运行鼻子测试生成器?我想给example转换成一个简单的基于类的版本:类内部的鼻子测试生成器

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 

我不得不通过更改日志来看看,并认为,这应该因为0.9.0a1版本。

我哪里错了?

回答

33

的解决方案是减去预期之一:做unittest.TestCase不继承,才能有nosetests发现发电机的方法。代码nosetests 1.1.3工作(最新从GitHub):

class TestA(object): 
    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 

此外,使用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 
+0

太烂了;如果能够使用unittest的assertRaisesRegexp来达到这个目的会很高兴:/ –

+4

@ChrisR:你可以使用'nose.tools.assert_raises_regexp' –

+0

为了增加这个答案,nose现在记录了这个行为。 “请注意,unittest.TestCase子类不支持方法生成器。” http://nose.readthedocs.org/en/latest/writing_tests.html –

-6

我相信你必须继承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 
+0

谢谢,这是有效的。 – Longestline

+0

这不适合我,使用鼻子1.1.2 –

+0

它不在这里工作。 – user983716