2010-05-04 106 views
2

我遵循this post的指示,但無法在全局範圍內識別我的方法。Web2py中的單元測試

錯誤消息:

ERROR: test_suggest_performer (__builtin__.TestSearch) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "applications/myapp/tests/test_search.py", line 24, in test_suggest_performer 
    suggs = suggest_flavors("straw") 
NameError: global name 'suggest_flavors' is not defined 

我的測試文件:

import unittest 

from gluon.globals import Request 
db = test_db 

execfile("applications/myapp/controllers/search.py", globals()) 

class TestSearch(unittest.TestCase): 
    def setUp(self): 
     request = Request() 

    def test_suggest_flavors(self): 
     suggs = suggest_flavors("straw") 
     self.assertEqual(len(suggs), 1) 
     self.assertEqual(suggs[0][1], 'Strawberry') 

我的控制器:

def suggest_flavors(term): 
    return [] 

有沒有人成功地完成像這樣的web2py的單元測試?

回答

3

請參閱:http://web2py.com/AlterEgo/default/show/260

注意,在你的榜樣作用 'suggest_flavors' 應在 '應用程序/ MyApp的/控制器/ search.py​​' 來定義。

+0

謝謝!我忘記了我在模塊中有更深一層的真實邏輯。我用'myapp/search.py​​'代替'controllers/search.py​​'。 – 2010-05-04 23:09:21

0

我對web2py沒有任何經驗,但是使用了其他框架。看着你的代碼,我有點困惑。是否有客觀原因應該使用execfile?使用常規導入語句不是更好嗎?因此,您可以寫下:

from applications.myapp.controllers.search import suggest_flavors 

這是pythoners的更清晰的代碼。

請注意,在這種情況下,您應該在路徑的每個目錄中放置__init__.py,以便dirs將形成程序包/模塊層次結構。

+1

web2py的工作原理有點不同,因爲它在全局加載一些東西。 execfile「執行你的控制器文件,把所有的函數聲明放到本地命名空間中。把globals()傳遞給execfile()命令可以讓你的控制器看到你的數據庫。 – 2010-05-04 22:01:46