0

3 つのファイルがあります。1 つはテストを含み、1 つはデータを含み、もう 1 つはテストを実行するための指示を含みます。

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 を 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/です。

ありがとうございます。エラーは次のとおりです。

エラーは、試みたアプローチによって異なることに注意してください。

with 'allowed': {'test1': Base.is_true}}): _ __ _ __ _ __ __ _ __ _ _ __ _ ___ tests /test_execute.py 収集エラー_ __ _ _ __ _ _ __ _ _ __ _ ___ tests / test_execute.py : 6 : in

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

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

from 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: で

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

4

2 に答える 2

0

Base.is_trueとには違いがありますis_true。最初のものは object のメソッドでありBase、2 つ目はコード内の未定義の関数です。メソッドの辞書を用意して、次のように呼び出すことができます。

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

このようにしてメソッドを呼び出し、base引数として与えますself

于 2012-05-09T15:17:03.487 に答える
0

「import Base」行を datadrv.py に追加する必要があります。

これにより、「ベースが定義されていません」というエラーが解決されるため、 {'test1': Base.is_true} を使用できます

于 2012-05-09T16:25:16.083 に答える