我有一个使用包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的实际连接来测试它:
试验_电影.py在
^{pr2}$假的_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
导入!当调用tmdb.Movies()
时,testMovie
对象仍然接收tmdbsimple.movies.Movies
的实例,而不是fake_tmdbsimple.Movies
。我相对确定这是由于我的“不是模仿对象的使用位置,而是它的来源”。然而,在本例中,使用pytest
和{
我这样做对吗?如果是这样,我需要做什么才能成功地模拟整个tmdbsimple
包?如果不是,那么在不实际访问TMDb的情况下测试我的Movie()
类的正确方法是什么?在
我以前有过一个有效的实现方法,比如:
试验_电影.py公司名称:
这样做的优点是不需要}中的每一个似乎都不雅观。如果我想用
pytest-mock
(还有工作的优点…),但是单独地修补Movies
、Find
、和{tmdbsimple
的伪版本测试其他模块,那么还需要重新实现伪类。这也让我内心的完美主义者很恼火,我试图模仿一个完整的软件包,但却不知道怎么做。在相关问题 更多 >
编程相关推荐