使用python-twitter结合vcrpy录制API请求未生成cassette文件的问题
解决python-twitter与vcrpy无法生成cassette文件的问题
当然可以实现!我来帮你排查下问题所在,从几个关键方向逐一解决:
1. 避免VCRTestCase与装饰器的冲突
你继承了VCRTestCase,这个类本身已经内置了vcr的录制/回放功能,不需要再额外添加@vcr.use_cassette()装饰器。双重配置很容易导致冲突,反而让vcr无法正常生成cassette文件。
修改测试代码,去掉多余的装饰器:
from vcr_unittest import VCRTestCase import twitter from django.conf import settings class TwitterRetrievalAndStorageTests(VCRTestCase): def test_recorded_session(self): api = twitter.Api( consumer_key=settings.TWITTER_CONSUMER_KEY, consumer_secret=settings.TWITTER_CONSUMER_SECRET, access_token_key=settings.TWITTER_ACCESS_KEY, access_token_secret=settings.TWITTER_ACCESS_SECRET ) statuses = api.GetUserTimeline(screen_name='nntaleb') for s in statuses: print(s)
2. 确认cassette存储目录存在
VCRTestCase默认会把cassette文件放在测试文件同级的fixtures/vcr_cassettes/目录下。如果这个目录不存在,vcr没有权限自动创建的话,就无法写入文件。你可以手动创建这个目录,或者自定义存储路径:
import os from vcr_unittest import VCRTestCase class TwitterRetrievalAndStorageTests(VCRTestCase): def get_vcr_cassette_dir(self): # 自定义cassette存放目录,比如tests/cassettes/ return os.path.join(os.path.dirname(__file__), 'cassettes') def test_recorded_session(self): # ... 测试代码 ...
3. 确保vcr能拦截python-twitter的requests调用
python-twitter确实依赖requests发起请求,但偶尔会因为虚拟环境隔离、依赖版本不一致等问题,导致vcr的猴子补丁没覆盖到python-twitter内部的requests实例。你可以做两步验证:
- 先写个简单的手动请求测试,确认vcr基础功能正常:
def test_manual_request(self): import requests requests.get("https://httpbin.org/get")
如果这个请求能生成cassette,说明vcr没问题。此时可以在测试开头强制注入vcr的拦截逻辑:
import vcr # 强制让vcr拦截requests的所有调用 vcr.patcher.inject('requests', vcr.stubs.VCRHTTPConnection, vcr.stubs.VCRHTTPSConnection)
4. 调整vcr的记录模式
vcr默认的记录模式是once——如果已有同名cassette文件,会直接复用而不重新生成。你可以改成new_episodes(新增请求会追加到cassette)或者all(每次都重新录制):
class TwitterRetrievalAndStorageTests(VCRTestCase): def get_vcr(self): vcr_instance = super().get_vcr() vcr_instance.record_mode = 'new_episodes' return vcr_instance # ... 测试方法 ...
按照上面的步骤调整后,应该就能正常生成cassette文件了。
内容的提问来源于stack exchange,提问作者Dimitrios Mistriotis
相关产品推荐
相关产品推荐

