当使用单独的数据文件时,尝试传递函数字典在python中失败

时间:2012-05-09 14:51:28

标签: python function dictionary

我有三个档案;一个包含测试,一个包含数据,另一个包含运行测试的指令。

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个目录; lib,数据和测试。将test_execute.py放在tests中,将datadrv.py放在data中,将base.py放在lib中。你需要运行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}}): 的 _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___ 错误收集测试/ test_execute.py _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___ tests / test_execute.py:6:in

  

来自data.datadrv import *   data / datadrv.py:22:in                                        'allowed':{'test1':Base.is_true}})   E NameError:未定义名称“Base”   ================================================== == 1秒内错误=========================================== ==========

'allowed': {'test1': base.is_true}}): tests / test_execute.py:6:in

  

来自data.datadrv import *   data / datadrv.py:22:in                                        'allowed':{'test1':base.is_true}})   E NameError:未定义名称“base”

使用Assert.true(base.functionToCall())

tests / test_execute.py:6:in

  

来自data.datadrv import *   data / datadrv.py:22:in                                        'allowed':{'test1':is_true}})   E NameError:未定义名称'is_true'

2 个答案:

答案 0 :(得分:0)

Base.is_trueis_true之间存在差异,第一个是对象Base的方法,第二个是代码中未定义的函数。你可以有一个方法词典,并按如下方式调用它们:

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

这样您就可以调用方法并将base作为参数self

答案 1 :(得分:0)

您需要在datadrv.py中添加'import Base'行。

这将解决'Base is not defined'错误,因此您可以使用{'test1':Base.is_true}