2012-05-09 27 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}

相關問題