2017-10-10 17 views
11

मैं एक दृश्य वर्तमान एक प्रश्न में उपयोगकर्ता के प्रवेश का उपयोग करता है के लिए एक इकाई परीक्षण लिख रहा हूँ:pytest के लिए current_user कैसे सेट करें?

@app.route('/vendors/create', methods=['GET', 'POST']) 
@login_required 
def create_vendors(): 
    vendor_form = VendorForm(request.form) 
    if vendor_form.validate_on_submit(): 
     vendor = db.session.query(Vendors).filter(Vendors.name == vendor_form.name.data, 
                Vendors.users.contains(g.user)).first() 
     if vendor: 
      flash('There is a vendor with this name already.') 
      return redirect(url_for('create_vendors', vendor_form=vendor_form)) 
     vendor = Vendors(name=vendor_form.name.data, aws_access_key=vendor_form.aws_access_key.data, 
         merchant_key=vendor_form.merchant_key.data, secret_key=vendor_form.secret_key.data) 
     vendor.users.append(current_user) 
     db.session.add(vendor) 
     db.session.commit() 
     return redirect(url_for('vendors')) 
    return render_template('edit_vendor.html', vendor_form=vendor_form) 

और परीक्षण:

def test_create_vendor(self): 
    response = TestViews.client.post('/vendors/create', follow_redirects=True, 
            data=dict(name='Name', aws_access_key='aws_access_key', 
               merchant_key='merchant_key', 
               secret_key='secret_key')) 
    assert response.status_code == 200 
    vendors = db.session.query(Vendors).filter(Vendors.aws_access_key == 'aws_access_key').all() 
    assert len(vendors) == 1 
    assert vendors[0].name == 'Name' 

और अपनी सेटिंग्स LOGIN_DISABLED = True में।

मेरी समस्या यह है कि परीक्षण current_user चलाते समय कभी सेट नहीं होता है।

मैंने परीक्षण क्लाइंट का उपयोग करके लॉग इन करने और with TestLogin.client: में अपने परीक्षणों को लपेटने का प्रयास किया है, लेकिन current_user अभी कभी सेट नहीं है। इसे कैसे सेट करें इस पर कोई विचार?

+0

आप कॉल किया 'login_user' (' flask_security की तरह एक निश्चित वापसी मान सेट के आधार पर वास्तविक उपयोगकर्ता प्राप्त करने के लिए। utils') अपने सेटअप में? आप 'self.client' के साथ भी कोशिश कर सकते हैं: ' –

+0

हाँ, इनमें से कोई भी काम नहीं। – ruipacheco

+0

'self.client.post (... के बारे में कैसे) 'TestViews.client.post (...)' –

उत्तर

6

मैं इस सवाल

from flask import Flask, request, 
from flask_login import LoginManager 
from flask_login.utils import login_required, current_user, login_user 

app = Flask(__name__) 
app.secret_key = 'super secret key' 
app.config['SESSION_TYPE'] = 'filesystem' 

login_manager = LoginManager() 
login_manager.init_app(app) 

class MyUser(): 
    name = "tarun" 

    def is_authenticated(self): 
     return True 

    def is_active(self): 
     return True 

    def is_anonymous(self): 
     return False 

    def get_id(self): 
     return 10 


@login_manager.user_loader 
def load_user(user_id): 
    return MyUser() 

@app.route("/login", methods=["POST"]) 
def login(): 
    login_user(MyUser()) 
    return "Authenticated" 

@app.route("/", methods=["GET", "POST"]) 
@login_required 
def index(): 
    return "Authenticated " # + current_user 


if __name__ == "__main__": 
    app.run(debug=True) 

वहाँ प्रवाह में लॉग इन परीक्षण के लिए विभिन्न तरीके हैं के लिए बनाया नीचे दिए गए नमूना अनुप्रयोग पर विचार करें।

अक्षम लॉग इन और

इस में @login_required आप अनुरोध कॉल में current_user का उपयोग नहीं करते और सिर्फ एक प्रमाणीकृत उपयोगकर्ता के लिए प्रवाह की रक्षा करना। इस तरह के मामले में आप दृष्टिकोण

import flasktest as flaskr 

class FlaskrTestCase(unittest.TestCase): 

    def setUp(self): 
     flaskr.app.testing = True 
     flaskr.app.config['LOGIN_DISABLED'] = True 
     flaskr.app.login_manager.init_app(flaskr.app) 
     self.app = flaskr.app.test_client() 

    def test_without_login(self): 
     res = self.app.post("/") 

     assert "Unauthorized" in res.data 

की तरह नीचे का उपयोग परीक्षण इस मामले में असफल हो जायेगी रूप में उपयोगकर्ता इच्छा एक प्रमाणीकृत प्रवाह का उपयोग करने की अनुमति देता है सकते हैं। और current_user को बेनामी उपयोगकर्ता के रूप में सेट किया जाएगा। और यह @login_required अक्षम करने जितना अच्छा है।

वास्तविक लॉगिन

यह आप विश्वास है कि आप जहाँ आप वास्तव में के लिए लॉग इन

import unittest 

import flasktest as flaskr 

class FlaskrTestCase(unittest.TestCase): 

    def setUp(self): 
     flaskr.app.testing = True 
     self.app = flaskr.app.test_client() 

    def tearDown(self): 
     pass 

    def test_login(self): 
     self.app.post("/login") 

     res = self.app.get("/") 

     assert "Authenticated" in res.data 

    def test_without_login(self): 
     res = self.app.post("/") 

     assert "Unauthorized" in res.data 

यह भी तय करेंगे एंडपॉइंट में पोस्ट उपयोग करके आपके एप्लिकेशन के लिए लॉग इन कर सकते हैं बनाने की जरूरत है ऐसा करने के लिए के साथ परीक्षण current_user सही ढंग से। मेरे मामले में मैं किसी भी रूप डेटा पैरामीटर नहीं लिया, आपके मामले में आप की तरह नीचे

self.app.post('/login', data=dict(
     username=username, 
     password=password 
    ), follow_redirects=True) 

सत्र कुकीज़

का उपयोग करते हुए इस मामले में कुछ का उपयोग करेगा आप सत्र सेट user_id और _fresh

def test_login_session(self): 
    with self.app.session_transaction() as sess: 
     sess['user_id'] = '12' 
     sess['_fresh'] = True # https://flask-login.readthedocs.org/en/latest/#fresh-logins 

    res = self.app.get("/") 

    assert "Authenticated" in res.data 

यह बदले में फोन करेगा

@login_manager.user_loader 
def load_user(user_id): 
    return MyUser() 

user_id12

+0

यह सुनिश्चित नहीं है कि यह मेरी समस्या का प्रतिनिधित्व करता है। – ruipacheco

+0

@ruipacheco मुझे लगता है कि यह उत्तर आपकी समस्या हल करता है, क्या आप कृपया बता सकते हैं कि यह आपके प्रश्न का समाधान क्यों नहीं करता है। – timakro

+0

मैंने जो कुछ भी दिखाया है, मैंने कोशिश की है, फिर भी जब मैं यूनिट परीक्षण चलाता हूं तो मेरे विचारों में वर्तमान_यूसर नहीं होता है। वे दृश्य जो current_user पर काम नहीं करते हैं ठीक काम करते हैं। – ruipacheco

-1

सीधे शब्दों में नकली flask_login.current_user सत्र में हमारे द्वारा उपलब्ध कराई गई और 'testuser'

संबंधित मुद्दे