4

既存のクラスでメソッドをテストしようとしています。クラスのメソッド内で、メソッドinputStreamThreadが呼び出されます。Foo.crawler.crawlerapp.CrawlerAppaddUrl

inputStreamThreadstdin から読み取ってから呼び出すaddUrl

addUrlCrawlerAppクラスにもいる

assert_called_withモックで使用して、正しいことを行って呼び出していることaddUrlを確認できることを望んでいましたinputStreamThreadaddUrl

問題は、内部のモックの構文を正しく取得できないことaddUrlですCrawlerApp

モックドキュメントから直接例を使用しましたが、以下に示すエラーが発生します

ご覧のとおり、stdin をモックして、テスト データを表示できるようにしています。

私の質問は、この種のテストを実行し、エラーが表示されないようにするためにどのコードを使用するかです。

import Foo.crawler.crawlerapp
from unittest import TestCase
from mock import patch, Mock
from mephistopheles.messageformat import EventDataFrame
from mephistopheles.messageformat.types import adservers as pbufs
import time
import sys


class testDeserial(TestCase):

    def generate_dummy_auction_event(self,url):
        adunitinfo = pbufs.AdUnitInfo(index_on_page=0, url=url)
        geoloc = pbufs.GeoLocation(country="DE", region="low")
        userinfo = pbufs.UserInfo(user_hash=1,
                                  ip_octets=1,
                                  geolocation=geoloc,
                                  language="en")
        auctioninfo = pbufs.AuctionInfo(timestamp=int(time.time()),
                                        user=userinfo,
                                        ad_unit=adunitinfo)
        return auctioninfo

    def setUp(self):
        pass

    @patch.object(Foo.crawler.crawlerapp.CrawlerApp,'addUrl')
    def test_check_url(self, MaddUrl):
        url_a = "http://audaxing.wordpress.com"
        dummy_event = self.generate_dummy_auction_event(url_a)
        with patch("sys.stdin") as mock_stdin:
            mock_stdin.read.return_value = dummy_event
            ca._running = True
            input_thread = threading.Thread(target=self.inputStreamThread)
            input_thread.start()
            time.sleep(0.5)
            ca._running = False
        MaddUrl.assert_called_with(url_a)

テスト実行出力....

$ bin/tests --tests-pattern=test_deserialize
Test-module import failures:

Module: Foo.crawler.tests.test_deserialize

Traceback (most recent call last):
  File "/home/jamie/svn/Foo/crawler.buildout/trunk/src/Foo.crawler/Foo/crawler/tests/test_deserialize.py", line 11, in <module>
    class testDeserial(TestCase):
  File "/home/jamie/svn/Foo/crawler.buildout/trunk/src/Foo.crawler/Foo/crawler/tests/test_deserialize.py", line 28, in testDeserial
    @patch.object(Foo.crawler.crawlerapp.CrawlerApp,'addUrl')
AttributeError: 'function' object has no attribute 'object'



Test-modules with import problems:
  Foo.crawler.tests.test_deserialize
Total: 0 tests, 0 failures, 0 errors in 0.000 seconds.
4

2 に答える 2

3

最後にどうするかを考えました。タイプライターのことでちょっとしたサル、なぜ「patch.object」ではなく「patch」を使用しなければならないのか、またはなぜ最初に Mock() オブジェクトを作成する必要があるのか​​ わかりません。ドキュメントの例から可能なすべてのパターンを試しました

とにかく、これは私のために働く

def test_check_url(self):
    url_a = "http://audaxing.wordpress.com"
    dummy_event = self.generate_dummy_auction_event(url_a)
    with patch("sys.stdin") as mock_stdin:
        MaddUrl = Mock()
        Minit = Mock(return_value=None)
        with patch('Foo.crawler.crawlerapp.CrawlerApp.__init__', Minit, create=True):
            with patch('Foo.crawler.crawlerapp.CrawlerApp.addUrl', MaddUrl, create=True):

                ca = Foo.crawler.crawlerapp.CrawlerApp(1)
                mock_stdin.read.return_value = EventDataFrame(1, "TOKEN1", dummy_event.SerializeToString()).to_bytes()
                ca._running = True
                input_thread = threading.Thread(target=ca.inputStreamThread)
                input_thread.start()
                time.sleep(0.5)
                ca._running = False
    MaddUrl.assert_called_with(url_a)
于 2013-04-10T15:15:41.987 に答える