【问题标题】:Django functional LiveServerTestCase - After submitting form with selenium, objects save to non-test databaseDjango 功能 LiveServerTestCase - 使用 selenium 提交表单后,对象保存到非测试数据库
【发布时间】:2013-06-30 09:14:58
【问题描述】:

为此我完全失去了理智。我无法弄清楚为什么会这样。每次我运行这个测试时,对象都会保存到正常的非测试数据库中。但是,测试结束时的两个断言无论如何都失败了,说他们在数据库中找不到任何用户,即使每次测试运行时我都必须进入管理员删除它在 localhost 上创建的对象。我在我的设置中使用 SQLITE3,并且我知道 SQLITE 测试应该在内存中运行,而不是访问数据库。我已经搜索和搜索,在网上找不到任何有用的信息。这是测试功能:

 import time
import datetime

from django.test import TestCase, LiveServerTestCase
from django.core.urlresolvers import resolve
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from django.contrib.auth.models import User

from apps.registration.forms import RegistrationForm

class NewVisitorTest(LiveServerTestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(3)

    def tearDown(self):
        self.browser.quit()

    def test_registration_process(self):

        # Goes to registration page

        self.browser.get('http://localhost:8000/register/')

        # User can find sign up form
        registration_form = self.browser.find_element_by_id('id_registration_form')

        # User can fill out sign up form
        first_name_input = self.browser.find_element_by_id('id_first_name')
        first_name_input.send_keys('Jim')

        last_name_input = self.browser.find_element_by_id('id_last_name')
        last_name_input.send_keys('Barrow')

        date = datetime.date.today()
        date_input = self.browser.find_element_by_id('id_birthday')
        date_input.send_keys(str(date))

        username_input = self.browser.find_element_by_id('id_username')
        username_input.send_keys('jim_barrow')

        password_input = self.browser.find_element_by_id('id_password')
        password_input.send_keys('kittensarecute')

        password_1_input = self.browser.find_element_by_id('id_password1')
        password_1_input.send_keys('kittensarecute')

        email_input = self.browser.find_element_by_id('id_email')
        email_input.send_keys('jim_barrow@gmail.com')

        # User can submit sign up form
        registration_form.submit()

        # User is now registered as a user object
        users = User.objects.all()
        self.assertEqual(len(users), 1)

        # User is now registered as a person object
        persons = Person.objects.all()
        self.assertEqual(len(persons), 1)

if __name__ == '__main__':
    unittest.main()

如果我可以提供任何其他上下文,我会很乐意向您展示。这实际上是一个空白项目,因此 settings.py 中没有任何奇怪或不寻常的设置可能会造成混淆。任何帮助将不胜感激。

【问题讨论】:

  • 永远不要使用 SQLLite 3 作为试验场。直到星期天,这 58 种方式都很可怕。
  • @limelights 刚刚在我的机器上安装并设置了 postgres,得到了同样的错误。我现在对此感到非常沮丧。
  • 你使用什么命令来运行测试?
  • @Alasdair python manage.py test tests.
  • @Alasdair 我只是厌倦了将测试用例移动到不同的应用程序并得到相同的结果。还尝试通过在 python 路径中指定它来仅运行测试用例,这也是不行的。

标签: python django


【解决方案1】:

根据the LiveServerTestCase docs,直播服务器默认在8081端口。但是,您正在从端口 8000 获取页面。

我希望您在端口 8000 上运行开发服务器,并且您的测试正在连接到它,因此您的新对象出现在非测试数据库中。您需要更改代码以从端口 8081 获取页面。

【讨论】:

    【解决方案2】:

    快速更新:

    从 Django 1.11 开始,LiveServerTestCase 设置的服务器使用本地主机分配的任何空闲端口,而不仅仅是 8081。

    您可以使用self.live_server_url 访问实时服务器的 URL 和端口,就像 docs 一样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-16
      • 2013-01-19
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 2018-08-05
      相关资源
      最近更新 更多