2013-05-28 116 views
2

我在寫單元測試有大致有以下組織的燒瓶中的應用:模板時,單元測試瓶應用

/myapplication 
    runner.py 
    /myapplication 
     __init__.py 
    /special 
     __init__.py 
     views.py 
     models.py 
    /static 
    /templates 
     index.html 
     /special 
      index_special.html 
    /tests 
     __init__.py 
     /special 
      __init__.py 
      test_special.py 

我特別想測試的special模塊正常工作。

我已經定義了以下內容:

  • special/views.py

    mod = Blueprint('special', __name__, template_folder="templates") 
    @mod.route('/standard') 
    def info(): 
        return render_template('special/index_special.html') 
    
  • myapplication/__init__.py

    app = Flask(__name__) 
    
    def register_blueprints(app): 
        from special.views import mod as special_blueprint 
        app.register_blueprint(special_blueprint, url_prefix='/special') 
    
    register_blueprints(app) 
    
  • myapplication/tests/test_special.py

    class TestSpecial: 
        @classmethod 
        def create_app(cls): 
         app = Flask(__name__) 
         register_blueprints(app) 
         return app 
    
        @classmethod 
        def setup_class(cls): 
         cls.app = cls.create_app() 
         cls.client = cls.app.test_client() 
    
        def test_connect(self): 
         r = self.client.get('/standard') 
         assert r.status_code == 200 
    

雖然應用程序本身工作正常,則test_connect單元測試失敗了TemplateNotFound: special/index_special.html例外。

我怎麼能告訴測試哪裏可以找到相應的模板?繞過的使用Flask-testing是不是一個真正的選擇模板渲染...

回答

1

你可以通過template_folder到應用程序對象的構造函數:

app = Flask(__name__, template_folder='../templates') 

您可能需要使用絕對路徑,我不知道。

http://flask.pocoo.org/docs/api/#flask.Flask

我大多傾向於有一個create_app功能與我的應用程序代碼和使用,在我的測試中,只是這樣的應用對象是一致的。我只會創建一個單獨的應用程序,如果我想測試一個藍圖或孤立的小東西。

def create_app(conf_obj=BaseSettings, conf_file='/etc/mysettings.cfg'): 
    app = Flask(__name__) 
    app.config.from_object(conf_obj) 
    app.config.from_pyfile(conf_file, silent=True) 
    .... blueprints etc 
    return app 

然後在我的測試:

class TestFoo(unittest.TestCase): 

    def setUp(self): 
     self.app = create_app(TestSettings) 
     .... 
+0

使用'template_folder'說法是不可取的,事實證明:模板可以參考一些路線不會被正確配置。使用你描述的工廠方法是要走的路,只要提供的藍圖已被正確定義(並且混合藍圖與標準的'@ app.route'方式就是要求麻煩......) –