【发布时间】:2017-06-13 10:08:23
【问题描述】:
在过去的几天里,我一直在尝试编写一个简单的测试来检查我的应用是否正常工作。我在完成程序后就被介绍了测试,这就是我在之后编写测试的原因。
我使用 python-instagram-ext 作为库和 python 版本 3.5.2
实际程序运行正常。它只是从 instagram 获取数据,将其中的一些保存到变量中并打印出来。
def handle_instagram(self, max_tag_id, search_string=settings.SEARCH_STRING, return_count=1):
instagram_api = InstagramAPI(access_token=access_token, client_secret=client_secret)
search_string = search_string.replace('#', '')
recent_media, next_ = instagram_api.tag_recent_media(count=5, max_tag_id=None,tag_name=search_string)
id = recent_media[0].id
print(id)
这部分效果很好。但我不希望我的测试从 instagram API 请求数据,所以我使用 mock 来模拟该函数。
from django.test import TestCase
from palautebot.models import Feedback
from django.core.management.base import BaseCommand
from palautebot.management.commands.palautebot import Command
import instagram
import datetime
class TestPalautebotTests(TestCase):
palautebot_cmd = Command()
@mock.patch('palautebot.management.commands.palautebot.InstagramAPI')
def test_handle_instagram(self, palautebot_instagram):
instagram_api = palautebot_instagram.InstagramAPI.return_value
user = instagram.models.User(1234, full_name='Test Account', username='test', profile_picture='http://pic.jpg')
recent_media = [instagram.models.Media(
users_in_photo= [],
comment_count= 0,
link= 'https://www.google.fi',
filter= 'Crema',
caption= instagram.models.Comment(created_at=datetime.datetime(2017, 6, 12, 9, 5, 10), user=user, id='1234', text='#nofilter Instagram test'),
like_count= 0,
id= '0000000000000000001_0000000001',
comments= [],
images= {
'thumbnail': instagram.models.Image('http://www.google.fi', 50, 50),
'low_resolution': instagram.models.Image('http://www.google.fi', 150, 150),
'standard_resolution': instagram.models.Image('http://www.google.fi', 400, 400)
},
tags= [instagram.models.Tag('nofilter')],
likes= [],
user= user,
type= 'image',
user_has_liked= False,
created_time= datetime.datetime(2017, 6, 12, 9, 5, 10))]
next_ = None
instagram_response = (recent_media, next_)
instagram_api.tag_recent_media.return_value = instagram_response
success_list= self.palautebot_cmd.handle_instagram(None, search_string='#nofilter')
self.assertEqual(success_list, [True])
我使用 facebook api 进行了类似的模拟,并且效果很好,但是当我尝试使用 instagram 进行模拟时,它会引发错误:
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/mock/mock.py", line 1305, in patched
return func(*args, **keywargs)
File "/home/bew/bew/src/palautebot/palautebot/tests.py", line 80, in test_handle_instagram
success_list= self.palautebot_cmd.handle_instagram(None, search_string='#helpalaute')
File "/home/bew/bew/src/palautebot/palautebot/management/commands/palautebot.py", line 162, in handle_instagram
tag_name=search_string
ValueError: not enough values to unpack (expected 2, got 0)
首先,我确信问题出在我用作 return_value 的数据上。但是如果我把它拿掉一些,或者试着用泡菜把它保存到变量中,这并不重要。在上面的示例中,我使用 instagram 库手动生成数据。数据与我从 instagram 获得的数据相似。
编辑: 原来在 python-instagram-ext 库或 instagram api 中发生了一些非常奇怪的事情,因为 max_tag_id 不适用于我的 id。所以看来问题可能不在于测试,而在于 api。
【问题讨论】:
-
试试@mock.patch(
.InstagramAPI') -
此应用没有视图
-
好的。 handler_intagram 方法的路径
-
目前就是这样
-
不,现在是 'palautebot.management.commands.palautebot.InstagramAPI' 我建议将其更改为 '
. 。 handle_instagram.InstagramAPI'
标签: python django unit-testing mocking instagram-api