简体   繁体   中英

Django tests failing when run with all test cases

I have a problem with tests. When I run some tests I launch separately, they pass. When all together then fail.

@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)

I read about this problem here why would a django test fail only when the full test suite is run? and tried to patch the validator in the serializer file as shown here

@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):
..............................................................

but then I get an incomprehensible for me exception

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'

help please understand what I'm doing wrong

project structure ( __init__.py files not listed)

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

Seeing this,

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

suggests that your import statement is inside a class or a def or some other statement.

Maybe the import statement is executed after you mocked apps.buildings.api.serializers . If you move this import to the top of the file, then BuildingBriefSerializer will probably become available before apps.buildings.api.serializers is mocked, and your tests will pass. This would also explain why the tests run, when you run them individually.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM