代码之家  ›  专栏  ›  技术社区  ›  AntoineLB

django:fixtures对象不可检索

  •  4
  • AntoineLB  · 技术社区  · 6 年前

    我在任何地方都没有看到liveservertestcase没有加载fixture,但是当我执行以下命令时:

    class FrontTest(LiveServerTestCase):
    
        fixtures = ['event.json']
    
    
        @classmethod
        def setUpClass(cls):
            super().setUpClass()
            print(Event.objects.all())
    

    Using existing test database for alias 'default'...
    []
    

    当我使用 TestCase

    class FrontTest(TestCase):
    
        fixtures = ['event.json']
    
    
        @classmethod
        def setUpClass(cls):
            super().setUpClass()
            print(Event.objects.all())
    

    输出是:

    [<Event: event search>]
    

    你知道为什么我的设备只在测试用例中加载吗?我真的很想使用硒。谢谢!

    PS: event.json :

    {
           "model": "mezzanine_agenda.event",
           "pk": 1,
           "fields": {
              "comments_count": 0,
              "keywords_string": "",
              "rating_count": 0,
              "rating_sum": 0,
              "rating_average": 0.0,
              "site": 1,
              "title": "event search",
              "slug": "event-search",
              "_meta_title": "",
              "description": "event search",
              "gen_description": true,
              "created": "2018-05-25T15:49:55.223Z",
              "updated": "2018-05-25T15:49:55.257Z",
              "status": 2,
              "publish_date": "2018-05-25T15:49:32Z",
              "expiry_date": null,
           }
        }, 
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   hoefling    6 年前

    那是因为 TransactionTestCase 在实例中加载装置' setUp 方法,因此其子类包括 LiveServerTestCase 做同样的事-除了 TestCase ,它使用每个类的单个原子事务并在 setUpClass 以加快测试执行速度。这种行为被加入 #20392 .

    这对您意味着您应该从 setupClass 设置 LiveServerTestCase 儿童班:

    class FrontendLiveTest(LiveServerTestCase):
    
        def setUp(self):
            # the transaction is opened, fixtures are loaded
            assert Event.objects.exists()
    

    注释

    以防你把 测试用例 s原子事务 LiveServerTestCase 背景线程:如 LiveServerTestCase 文档,

    它继承自 事务测试用例 而不是 测试用例 因为线程不共享相同的事务(除非在内存中使用 sqlite )每个线程都需要提交它们的所有事务,以便另一个线程可以看到更改。

        2
  •  1
  •   rtindru    6 年前

    首先,遗憾的是,django忽略了它找不到的设备。您看到的错误意味着django找不到fixture文件并失败,并显示警告: https://code.djangoproject.com/ticket/18990

    以下是Django如何找到固定装置:
    • 使用fixture文件的绝对路径不是一个好主意,因为fixture可能作为代码的一部分放置->这将覆盖第二种技术
    • 它在下面定义的所有目录下查找 settings.FIXTURE_DIRS
    • 它看起来很低沉 应用程序目录 在一个名为 fixtures 按惯例。

    在此基础上,查看文件的位置,可以解决此问题

    这是Django代码 fixture_dirs :

    @cached_property
    def fixture_dirs(self):
        """
        Return a list of fixture directories.
    
        The list contains the 'fixtures' subdirectory of each installed
        application, if it exists, the directories in FIXTURE_DIRS, and the
        current directory.
        """
        dirs = []
        fixture_dirs = settings.FIXTURE_DIRS
        if len(fixture_dirs) != len(set(fixture_dirs)):
            raise ImproperlyConfigured("settings.FIXTURE_DIRS contains duplicates.")
        for app_config in apps.get_app_configs():
            app_label = app_config.label
            app_dir = os.path.join(app_config.path, 'fixtures')
            if app_dir in fixture_dirs:
                raise ImproperlyConfigured(
                    "'%s' is a default fixture directory for the '%s' app "
                    "and cannot be listed in settings.FIXTURE_DIRS." % (app_dir, app_label)
                )
    
            if self.app_label and app_label != self.app_label:
                continue
            if os.path.isdir(app_dir):
                dirs.append(app_dir)
        dirs.extend(list(fixture_dirs))
        dirs.append('')
        dirs = [upath(os.path.abspath(os.path.realpath(d))) for d in dirs]
        return dirs