2016-04-23 17 views
0

私はフラスコ、テストフラスコSQLAlchemyのモデルでテストしようとしています。より正確には、first_or_404()を使用するこのモデルの静的メソッドと私は私のテスト作業を行う方法を見つけることができません。ここでフラスコ・テストおよびフラスコSQLAlchemyの:first_or_404()

問題を強調する自己完結型の例:

from flask import Flask 
from flask_sqlalchemy import SQLAlchemy 
from flask.ext.testing import TestCase 

db = SQLAlchemy() 

class ModelToTest(db.Model): 
    __tablename__ = 'model_to_test' 
    identifier = db.Column(db.String(80), unique=True, nullable=False, primary_key=True) 

    @staticmethod 
    def get_by_identifier(identifier): 
     return ModelToTest.query.filter_by(identifier=identifier).first_or_404() 

class Config: 
    DEBUG = True 
    TESTING = True 
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' 
    SQLALCHEMY_TRACK_MODIFICATIONS = False 

class TestGetByIdentifier(TestCase): 

    def create_app(self): 
     app = Flask('test') 
     app.config.from_object(Config()) 
     db.init_app(app) 
     return app 

    def setUp(self): 
     db.create_all() 

    def tearDown(self): 
     db.session.remove() 
     db.drop_all() 

    def test_get_by_identifier(self): 
     self.assert404(ModelToTest.get_by_identifier('identifier')) 

私はエラーを得た:

(my_env) PS C:\Dev\Test\Python\test_flask> nosetests-3.4.exe 
E 
====================================================================== 
ERROR: test_get_by_identifier (test_flask.TestGetByIdentifier) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Dev\Test\Python\test_flask\test_flask.py", line 37, in test_get_by_identifier 
    self.assert404(ModelToTest.get_by_identifier('identifier')) 
    File "C:\Dev\Test\Python\test_flask\test_flask.py", line 13, in get_by_identifier 
    return ModelToTest.query.filter_by(identifier=identifier).first_or_404() 
    File "c:\\my_env\lib\site-packages\flask_sqlalchemy\__init__.py", line 431, in first_or_404 
    abort(404) 
    File "c:\\my_env\lib\site-packages\werkzeug\exceptions.py", line 646, in __call__ 
    raise self.mapping[code](*args, **kwargs) 
werkzeug.exceptions.NotFound: 404: Not Found 

---------------------------------------------------------------------- 
Ran 1 test in 0.913s 

だから、ラインself.assert404(ModelToTest.get_by_identifier('identifier'))first_or_404()呼び出しで例外が発生しないと、この例外はありますwerkzeug.exceptions.NotFound、それはself.assert404()によって期待されるようではありません。このテストを実行するには

要件は次のとおりです。

  • フラスコ
  • フラスコSQLAlchemyの
  • フラスコ、テスト

それは私がアプリケーションでそれを機能を使用するときにことは注目に値します期待どおりに動作します。

ありがとうございます。

+0

をこれはまさに期待されていることをするようです。 – davidism

+0

@davidism申し訳ありませんが、私は間違った例を取っています。一致するエラーで修正された例。 – Johan

答えて

1

私はGitHubの上で受け取った答え引用している: `ID = id` becuaseあなたが何かを挿入していなかったので、あなたは404を取得する何の行はありません

https://github.com/jarus/flask-testing/issues/89

I believe this is a misunderstanding about the way to drive the test. The first_or_404 function will indeed raise a NotFound exception. When in the context of the request, the exception will bubble up, be handled, and turn into a 404 http response, which is what flask-testing is looking for.

However, you are not in the context of a request in this case since you are calling the method directly and it is simply resulting in an exception. You could do this to make the test work

from werkzeug.exceptions import NotFound 

def test_get_by_identifier(self): 
    with self.assertRaises(NotFound): 
     ModelToTest.get_by_identifier('identifier') 

Or, you can stick that function behind a route and test it using self.client which will correctly give you a 404 http response. However, testing the exception (without the use of flask-testing) may be more appropriate in this case given the level you are testing at.

関連する問題