Vor*_*ung 6 python unit-testing mocking python-2.7
我正在尝试在现有的类中测试方法。inputStreamThread在类的方法内调用Foo.crawler.crawlerapp.CrawlerApp该方法。addUrl
inputStreamThread从 stdin 读取然后调用addUrl
addUrl也在CrawlerApp班上
我希望能够assert_called_with在模拟上使用来addUrl检查是否inputStreamThread做了正确的事情并调用addUrl
问题是我无法获得正确的语法来模拟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)
Run Code Online (Sandbox Code Playgroud)
测试运行输出....
$ 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.
Run Code Online (Sandbox Code Playgroud)
我终于知道该怎么做了。有点像打字机上的猴子,不知道为什么我必须使用“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)
Run Code Online (Sandbox Code Playgroud)