У меня есть класс, использующий пакет tmdbsimple
:
фильм.py
import tmdbsimple as tmdb
tmdb.API_KEY = '12345'
class Movie():
def __init__(self, tmdb_id):
movie = tmdb.Movies(tmdb_id)
response = movie.info()
self.tmdb_id = tmdb_id
self.title = movie.title
self.vote_average = movie.vote_average
self.watched = False
*snip*
Это все хорошо, пока я не хочу проверить это, не полагаясь на фактическое подключение к TMDb:
test_movie.py
import pytest
import movie
from fake_tmdbsimple import FakeTmdbsimple
@pytest.fixture
def testMovie(mocker):
mocker.patch.dict('sys.modules', {'tmdbsimple': FakeTmdbsimple()})
return movie.Movie('1')
def test_creation_of_Movie(testMovie):
assert isinstance(testMovie, movie.Movie)
def test_properties_of_Movie(testMovie):
assert testMovie.tmdb_id == 1
assert testMovie.title == 'Example Movie'
assert testMovie.vote_average == 10
assert testMovie.watched == False
fake_tmdbsimple.py
class FakeTmdbsimple():
def __init__(self):
pass
class Movies():
_example_movie_data = {
1: {
'title': 'Example Movie',
'vote_average': 10.0
}
}
def __init__(self, tmdb_id):
self.tmdb_id = tmdb_id
def info(self):
self.title = self._example_movie_data[self.tmdb_id]['title']
self.vote_average = self._example_movie_data[self.tmdb_id]['vote_average']
class Find():
def __init__(self, identifier):
pass
def info(self, external_source):
return {
'movie_results': [
{'id': 1}
]
}
class Search():
def __init__(self):
pass
def movie(self, query):
return {
'results': [
{
'id': 1
}
]
}
Когда тест запускается, я получаю эту ошибку:
*snip*
self = <tmdbsimple.movies.Movies object at 0x110779cf8>
def __init__(self):
> from . import API_VERSION
E ImportError: cannot import name 'API_VERSION'
Тест все еще пытается импортировать из настоящего tmdbsimple
! Объект testMovie
по-прежнему получает экземпляр tmdbsimple.movies.Movies
вместо fake_tmdbsimple.Movies
при вызове tmdb.Movies()
. Я относительно уверен, что это результат моего «издевательства не над тем, где используется объект, а над тем, откуда он исходит». Однако в этом случае, используя pytest
и pytest-mock
, я не знаю, как сделать так, чтобы мок происходил там, где нужно.
Правильно ли я поступаю? Если да, то что мне нужно сделать, чтобы успешно смоделировать весь пакет tmdbsimple
? Если нет, то как правильно протестировать мой класс Movie()
без фактического доступа к TMDb?