如何使用 Flask-flask_testing 和 flask_wtf 包在 post 请求中发送表单数据?
这是我的 FlaskForm 模型和测试函数:
class BusinessTripProcessingForm(FlaskForm):
departure_time = DateTimeField('Exact departure date and time')
return_time = DateTimeField('Exact return date and time')
class TestBusinessTrip(TestCase):
def create_app(self):
self.app = create_app('testing')
self.client = self.app.test_client(self)
return self.app
def setUp(self):
loginmgr = LoginManager(app)
loginmgr.init_app(app)
# setup before executing the test
def tearDown(self):
db.session.remove()
@unittest.mock.patch('flask_login.utils._get_user')
def test_business_trip_request_processing(self, current_user):
mock_current_user = current_user
mock_current_user.is_authenticated = MagicMock(return_value=True)
mock_current_user.return_value.role.name = 'Administrator'
mock_current_user.return_value.email = 'admin@email.com'
mock_current_user.return_value.id = 1
btr = BusinessTripRequest(user_id=1, start_date='2021-01-08', end_date='2021-10-08')
DBSession.commit_to_db(btr)
btr = BusinessTripRequest(user_id=2, start_date='2021-08-15', end_date='2021-08-22')
DBSession.commit_to_db(btr)
data = dict(departure_time='2021-01-08 15:00', return_time='2021-10-08 14:10')
response = self.client.post('/business_trip_request_processing/1',
data=data)
self.assertEqual(response.status_code, 302)
这是我的路线的一部分:
@main.route('/business_trip_request_processing/<request_id>', methods=['GET', 'POST'])
@login_required
def business_trip_request_processing(request_id):
form = BusinessTripProcessingForm(data=request.form)
print('BusinessTripProcessingForm form data')
print(form.data)
print('-------------------')
print('request form data')
print(request.form)
print('-------------------')
路线的打印输出是:
'BusinessTripProcessingForm form data'
{'departure_time': None, 'return_time': None}
-------------------
和
'request form data'
ImmutableMultiDict([('departure_time', '2021-01-08 15:00'), ('return_time', '2021-10-08 14:10')])
-------------------
为什么 BusinessTripProcessingForm 看不到离开时间和返回时间的传递值?
此测试的测试配置是:
TESTING = True
LOGIN_DISABLED = False
DEBUG = True
WTF_CSRF_ENABLED = False