4

我正在尝试在已经存在的类中测试一个方法。在类的方法inputStreamThread中调用该方法。Foo.crawler.crawlerapp.CrawlerAppaddUrl

inputStreamThread从标准输入读取然后调用addUrl

addUrl也在CrawlerApp课堂上

我希望能够assert_called_with在模拟上使用addUrl来检查inputStreamThread是否在做正确的事情并打电话addUrl

问题是我无法为 inside 的模拟获得正确的addUrl语法CrawlerApp

我直接从模拟文档中使用了一个示例,但得到如下所示的错误

如您所见,我也在模拟标准输入以便能够在其上显示测试数据

我的问题是,我使用什么代码来执行这种测试而不显示错误?

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”而不是“patch.object”,或者为什么我需要先制作 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 回答
-1

我会说以下内容:

@patch.object... #1
def test_check... #2

相当于

def test_check... #2

test_check.object = ... #1

并且不能为功能对象分配新属性。

于 2013-04-10T14:48:35.943 回答