2017-06-13 11 views
0

私は過去の日、私のアプリが動作するかどうかをチェックする簡単なテストを書こうとしてきました。私は自分のプログラムが完成した直後にテストを受けたので、後でテストを書いています。Djangoテスト、Instagram応答エラーを嘲笑

私は、実際のプログラムが正しく動作するライブラリとPythonのバージョン3.5.2

としてのpython-Instagramの-EXTを使用しています。これは、単に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からのデータを要求することを望んでいないので、私はそのモックを模擬するためにモックを使用しています。

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から取得したデータと似ています。

編集: max_tag_idが自分のidで動作しないため、python-instagram-extライブラリまたはinstagram apiで非常に奇妙なことが起こりました。だから問題は、テストではなく、APIである可能性があります。

+0

てみてくださいする@ mock.patch(.InstagramAPI '<ビューへのパス>) – vZ10

+0

このアプリにはビュー[OK]を – Dosentti

+0

を持っていません。 handler_intagramメソッドへのパス – vZ10

答えて

0

私が前にやったのと同じ方法で問題を解決できませんでしたが、私はそれを回避する方法を見つけました。そこで、instagramAPIを嘲笑するのではなく、モックの設定side_effectによって特定の機能を模擬します。

class TestPalautebotTests(TestCase): 
     def mock_initialize_instagram(): 
      instagram_api = instagram.client.InstagramAPI(
       access_token='access_token_foo', 
       client_secret='client_secret_bar' 
      ) 
      return instagram_api 

     def mock_tag_recent_media(count=60, max_tag=None, tag_name=''): 
      recent_media_mock = 'instagram-data' 
      next_ = None 
      mock_data_from_instagram = (recent_media, next_) 
      return mock_data_from_instagram 

     @mock.patch('palautebot.management.commands.palautebot.Command.initialize_instagram',side_effect=mock_initialize_instagram) 
     @mock.patch('palautebot.management.commands.palautebot.InstagramAPI.tag_recent_media',side_effect=mock_tag_recent_media) 
     @mock.patch('palautebot.management.commands.palautebot.Command.answer_to_instagram',side_effect=return_true) 
     def test_handle_instagram(
      self, 
      mock_init_instagram, 
      mock_tag_recent_media, 
      mock_answer_to_instagram 
     ): 
      self.assertEqual(self.palautebot_cmd.handle_instagram(None), [True])