在运行所有测试用例时,Django测试失败

时间:2017-09-16 14:46:42

标签: django python-3.x django-rest-framework

我的测试有问题。当我运行一些测试时,我会单独启动,然后通过。当所有人在一起然后失败。

@mock.patch(
    'apps.abstract.validators.years_range_is_not_future', new=fake_years_range_is_not_future
)
def test_create_building_with_validation_of_foundation_period(self):

self.c.login(username=self.user.username, password='111')

response = self.c.post(
    '/en/api/buildings/',
    data={
        'name': "New Building",
        'foundation_period': {
            'lower': MIN_INT_VALUE,
            'upper': MAX_INT_VALUE
        },
        'stream': {
            'uuid': s_uuid(self.stream)
        }
    }
)

self.assertEqual(response.status_code, status.HTTP_201_CREATED)

我在这里读到了这个问题 why would a django test fail only when the full test suite is run? 并尝试在序列化程序文件中修补验证器,如下所示

@mock.patch(
    'apps.buildings.api.serializers.years_range_is_not_future', new=fake_years_range_is_not_future
)
def test_create_building_with_validation_of_foundation_period(self):
..............................................................

然后我得到一个难以理解的异常

Error
Traceback (most recent call last):
  File "/usr/lib/python3.5/unittest/mock.py", line 1049, in _dot_lookup
    return getattr(thing, comp)
AttributeError: module 'apps.buildings.api' has no attribute 'serializers'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.5/unittest/mock.py", line 1149, in patched
    arg = patching.__enter__()
  File "/usr/lib/python3.5/unittest/mock.py", line 1205, in __enter__
    self.target = self.getter()
  File "/usr/lib/python3.5/unittest/mock.py", line 1375, in <lambda>
    getter = lambda: _importer(target)
  File "/usr/lib/python3.5/unittest/mock.py", line 1062, in _importer
    thing = _dot_lookup(thing, comp, import_path)
  File "/usr/lib/python3.5/unittest/mock.py", line 1051, in _dot_lookup
    __import__(import_path)
  File "/home/env/project/apps/buildings/api/serializers.py", line 12, in <module>
    from apps.communities.api.serializers import CommunityBriefSerializer
  File "/home/env/project/apps/communities/api/serializers.py", line 297, in <module>
    class CommunityOfficialRequestBuildingSerializer(BaseCommunityOfficialRequestSerializer):
  File "/home/rp/env/project/apps/communities/api/serializers.py", line 299, in CommunityOfficialRequestBuildingSerializer
    from apps.buildings.api.serializers import BuildingBriefSerializer
ImportError: cannot import name 'BuildingBriefSerializer'

帮助请理解我做错了什么

项目结构(未列出__init__.py个文件)

project
       |__apps
             |__communities
             |             |_api
             |                  |_serializers.py
             |
             |__buildings
             |           |_api
             |           |    |_serializers.py
             |           |
             |           |_tests
             |                  |_test.py
             | 
             |_abstract
                      |_validators.py

1 个答案:

答案 0 :(得分:0)

看到这个,

Traceback (most recent call last):
  File "/home/rp/env/project/apps/communities/api/serializers.py", line 299, in CommunityOfficialRequestBuildingSerializer
    from apps.buildings.api.serializers import BuildingBriefSerializer

建议您的import语句位于classdef或其他声明中。

在模拟apps.buildings.api.serializers之后,可能会执行import语句。如果将此导入移动到文件顶部,则BuildingBriefSerializer可能会在apps.buildings.api.serializers被模拟之前变为可用,并且您的测试将通过。 这也可以解释为什么测试运行时,单独运行它们。