在python测试中模拟javascript序列化

时间:2016-11-25 13:45:38

标签: python unit-testing serialization django-forms

我有一个网络服务,允许用户填写表单,点击按钮,我的应用程序检查是否可以使用表单中的数据登录到其他服务器。

现在我想为此编写一个测试 - 确保当我传递正确的数据时,我的函数能够连接到服务器,并且如果它不能返回正确的消息。

通常发生的是,在单击按钮后,将运行以下js函数:

function someFunction(person_id) {
    Dajaxice.someAjaxFunction(someCallback, {
        'person_id': person_id,
        'credentials_form': $("#some_form").serialize(true)
    });
    loading.show_loader();
}

稍后,ajax函数调用一个view函数,它执行以下操作:

def some_python_function(person_id, credentials_form):
    credentials, created = SomeCredentials.objects.get_or_create(person=person_id)
    some_cred_form= SomeCredentialsForm(deserialize_form(credentials_form), instance=credentials)
    if some_cred_form.is_valid():
        try:
            (...some_words_and_things_here...)

现在,我的问题是在编写测​​试时我没有调用js函数,我只想将表单发送到some_python_function。但是,我不能直接这样做:

    form_data = {'data_1': data_1, "data_2": data_2, 'data_3': data_3}
    form = SomeCredentialsForm(data=form_data)
    self.assertEqual(some_python_function(person_id, form), (...))

显然,这不起作用:因为some_cred_form.is_valid()== False,所以代码的相关部分没有被检查。 无论js函数做什么,我都需要以某种方式对我的表单做。但是我该怎么做?

1 个答案:

答案 0 :(得分:1)

Jquery serialize方法只返回一个查询字符串。您可以尝试创建一个类似的字符串并将其传递给函数:

form_data = 'data_1={}&data_2={}&data_3={}'.format(data_1, data_2, data_3)
self.assertEqual(some_python_function(person_id, form_data), (...))