2012-05-09 43 views
0

我有三个文件;一个包含测试,一个包含数据,另一个包含运行测试的说明。试图传递一个函数字典在Python中使用单独的文件数据时失败

base.py

#!/usr/bin/env python 

class Base(object): 

    def __init__(self): 
     pass 

    def is_true(self): 
     return True 

datadrv.py

def pytest_generate_tests(metafunc): 
    """ 
    Parse the data provided in scenarios. 
    """ 
    idlist = [] 
    argvalues = [] 
    for scenario in metafunc.cls.scenarios: 
     idlist.append(scenario[0]) 
     items = scenario[1].items() 
     argnames = [x[0] for x in items] 
     argvalues.append(([x[1] for x in items])) 
    metafunc.parametrize(argnames, argvalues, ids=idlist) 
### 
# EDIT BELOW 
# ADD NEW SCENARIOS 
### 

scenario1 = ('ACME_Manage_Keys', { 'org': 'ACME_Corporation', 
            'perm_name': 'ManageAcmeCorp', 
            'resource': 'activation_keys', 
            'verbs': ('manage_all',), 
            'allowed': {"test1": is_true}}) 

test_execute.py

#!/usr/bin/env python 

from lib.base import Base 
import pytest 
from unittestzero import Assert 
from data.datadrv import * 

class TestDictionarySupport(object): 
    scenarios = [scenario1] 

    def test_datadriven_support(self, 
      org, 
      perm_name, 
      resource, 
      verbs, 
      allowed): 

     base = Base() 

     functionToCall = allowed['test1'] 
     Assert.true(base.functionToCall()) 
     """ THIS WORKS, uncomment the block to see """ 
     """ 
     Assert.true(base.is_true()) 
     """ 

我的最终目标是让Assert.true(base.is_true())但是每次我都做尝试已导致TypeErrors或NameErrors。我在这里错过什么或做错了什么?

重现以上只需创建3个目录;库,数据和测试。测试中放置test_execute.py,数据放置datadrv.py,放置base.py。你需要pytest和unittestzero来运行。从根目录可以运行py.test。

注:当我有这么多的工作,我将有一个for循环和多次测试,以便functionToCall = allowed['test1']将成为像functionToCall = key[value]

而且,我的出发参考点是http://code.activestate.com/recipes/65126-dictionary-of-methodsfunctions/

谢谢你,错误如下:

注意错误的做法不同尝试。

'allowed': {'test1': Base.is_true}})随着: _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___ ERROR收集测试/ test_execute.py _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___ 测试/ test_execute.py:6:

from data.datadrv import * data/datadrv.py:22: in 'allowed': {'test1': Base.is_true}}) E NameError: name 'Base' is not defined ==================================================== 1 error in 0.02 seconds =====================================================

随着'allowed': {'test1': base.is_true}}): 测试/ test_execute.py: 6:

from data.datadrv import * data/datadrv.py:22: in 'allowed': {'test1': base.is_true}}) E NameError: name 'base' is not defined

随着Assert.true(base.functionToCall())

tests/test_execute。吡啶:6:

from data.datadrv import * data/datadrv.py:22: in 'allowed': {'test1': is_true}}) E NameError: name 'is_true' is not defined

+0

凡'Assert'定义? – rubik

+1

发布您的错误消息和回溯 –

+0

更新与适当的导入。 – Eric

回答

0

Base.is_trueis_true之间的差,第一个是对象Base的方法,第二个是在代码中未定义的功能。你可以有方法的字典,并呼吁他们这样的:

d = {'test1': Base.is_true} 
f = d['test1'] 
f(base) 

这样你调用该方法,并给予base作为参数self

+0

我试过这个,这个方法失败:E NameError:name'Base'没有定义。 在data/datadrv.py我修改了允许读'允许':{'test1':Base.is_true}}),也尝试了base.is_true。这里的问题是没有引号python期待Base.is_true是什么。这里的挑战与我参考的不同之处在于我使用多个文件而不是1。 – Eric

0

您需要将一个'import Base'行添加到datadrv.py。

这将解决“基本没有定义”的错误,所以你可以使用{“测试1”:Base.is_true}

相关问题