2012-10-21 117 views
0

我知道如何为类设置属性,但无法找到如何为一个文件设置..如何将属性设置为一个python文件?

flow = ['1','4','5','2'] 

def test_generator(test): 
    def test_parser(self): 
     print test 
    return test_parser 

class API_tests(unittest.TestCase): 
     pass 


for test in flow: 
    test_name = 'test_%s' % test 
    test = test_generator(test) 
    setattr(API_tests, test_name, test) 

这一点,将工作。

我要替换SETATTR()的API_tests是文件对象,而不是类,因此该文件将与功能(test_generator X 4)追加对它们进行设置动态

我的预期结果我跑“nosetests -v”在命令行中,它会显示“4个测试通过”

这个问题可以在其他作品:如何获得当前文件为对象

感谢

+0

当前文件的名称是'__file__'。这是一个字符串,但是。 – aychedee

+2

您是否打算创建X(本例中为4)测试nosetest可以运行?如果是这样,请查看nosetest对测试生成器的支持。简而言之,编写一个可生成可调用对象的生成器以及可调用对象的参数。鼻子会将它们全部运行给你。 –

+0

在这里你可以找到如何在当前模块中设置属性(我认为这是你实际要求的):[我如何在当前模块上调用setattr()?](http://stackoverflow.com/questions/2933470 /怎么办,我叩SETATTR - 上的电流模块)。 –

回答

0

而不是动态创建在模块命名空间中测试函数(就像你认为的那样),使用nosetest支持测试生成器。

如果鼻子检测到一个生成器,并且该生成器产生可调用对象以及可调用对象所需的任何参数,它将迭代它并为您运行每个测试。

你的例子可以改写为

def check_flow_value(val): 
    # assert something about val 
    assert True 

def test_flows(): 
    flow = ['1','4','5','2'] 
    for val in flow: 
     yield check_flow_value, val 

鉴于此,鼻子会跑4次测试

+0

响应将是这样的: API_tests.test_generator.test_flows( '1')...确定 API_tests.test_generator.test_flows( '4',)...确定 API_tests.test_generator.test_flows( '5', )...好吧 API_tests.test_generator.test_flows('2',)...好吧 我用这种方法的问题是1,2,4,5实际上会被替换为参数的休字典。我只是想提供输出我将生成的测试名称,它只会显示名称,而不是参数。 可能吗? – eligro

+0

如果你担心你的输出可以动态地包装你的测试函数,那么单元测试或nosetest所看到的** test **将是一个非简单函数,没有参数。例如。部分:'new_test_method = partial(create_generic_test,arg_name = arg)' – Hardbyte

相关问题