久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

修補類會產(chǎn)生“AttributeError:Mock object has no attrib

patching a class yields quot;AttributeError: Mock object has no attributequot; when accessing instance attributes(修補類會產(chǎn)生“AttributeError:Mock object has no attribute;訪問實例屬性時) - IT屋-程序員軟件開發(fā)技術(shù)分享
本文介紹了修補類會產(chǎn)生“AttributeError:Mock object has no attribute";訪問實例屬性時的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

問題
mock.patchautospec=True 一起使用來修補類不會保留該類實例的屬性.

The Problem
Using mock.patch with autospec=True to patch a class is not preserving attributes of instances of that class.

詳情
我正在嘗試測試一個類 Bar,它將類 Foo 的實例實例化為名為 fooBar 對象屬性.被測的Bar方法叫做bar;它調(diào)用屬于 BarFoo 實例的方法 foo.在測試這一點時,我正在模擬 Foo,因為我只想測試 Bar 是否正在訪問正確的 Foo 成員:

The Details
I am trying to test a class Bar that instantiates an instance of class Foo as a Bar object attribute called foo. The Bar method under test is called bar; it calls method foo of the Foo instance belonging to Bar. In testing this, I am mocking Foo, as I only want to test that Bar is accessing the correct Foo member:

import unittest
from mock import patch

class Foo(object):
    def __init__(self):
        self.foo = 'foo'

class Bar(object):
    def __init__(self):
        self.foo = Foo()

    def bar(self):
        return self.foo.foo

class TestBar(unittest.TestCase):
    @patch('foo.Foo', autospec=True)
    def test_patched(self, mock_Foo):
        Bar().bar()

    def test_unpatched(self):
        assert Bar().bar() == 'foo'

類和方法工作得很好(test_unpatched 通過),但是當(dāng)我嘗試使用 autospec=True,我遇到AttributeError: Mock object has no attribute 'foo'"

The classes and methods work just fine (test_unpatched passes), but when I try to Foo in a test case (tested using both nosetests and pytest) using autospec=True, I encounter "AttributeError: Mock object has no attribute 'foo'"

19:39 $ nosetests -sv foo.py
test_patched (foo.TestBar) ... ERROR
test_unpatched (foo.TestBar) ... ok

======================================================================
ERROR: test_patched (foo.TestBar)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 1201, in patched
    return func(*args, **keywargs)
  File "/home/vagrant/dev/constellation/test/foo.py", line 19, in test_patched
    Bar().bar()
  File "/home/vagrant/dev/constellation/test/foo.py", line 14, in bar
    return self.foo.foo
  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 658, in __getattr__
    raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'foo'

確實,當(dāng)我打印出 mock_Foo.return_value.__dict__ 時,我可以看到 foo 不在子項或方法列表中:

Indeed, when I print out mock_Foo.return_value.__dict__, I can see that foo is not in the list of children or methods:

{'_mock_call_args': None,
 '_mock_call_args_list': [],
 '_mock_call_count': 0,
 '_mock_called': False,
 '_mock_children': {},
 '_mock_delegate': None,
 '_mock_methods': ['__class__',
                   '__delattr__',
                   '__dict__',
                   '__doc__',
                   '__format__',
                   '__getattribute__',
                   '__hash__',
                   '__init__',
                   '__module__',
                   '__new__',
                   '__reduce__',
                   '__reduce_ex__',
                   '__repr__',
                   '__setattr__',
                   '__sizeof__',
                   '__str__',
                   '__subclasshook__',
                   '__weakref__'],
 '_mock_mock_calls': [],
 '_mock_name': '()',
 '_mock_new_name': '()',
 '_mock_new_parent': <MagicMock name='Foo' spec='Foo' id='38485392'>,
 '_mock_parent': <MagicMock name='Foo' spec='Foo' id='38485392'>,
 '_mock_wraps': None,
 '_spec_class': <class 'foo.Foo'>,
 '_spec_set': None,
 'method_calls': []}

我對 autospec 的理解是,如果為 True,補丁規(guī)范應(yīng)該遞歸應(yīng)用.既然 foo 確實是 Foo 實例的一個屬性,難道不應(yīng)該打補丁嗎?如果沒有,我如何讓 Foo 模擬來保留 Foo 實例的屬性?

My understanding of autospec is that, if True, the patch specs should apply recursively. Since foo is indeed an attribute of Foo instances, should it not be patched? If not, how do I get the Foo mock to preserve the attributes of Foo instances?

注意:
這是一個顯示基本問題的簡單示例.實際上,我正在模擬第三方 module.Class -- consul.Consul -- 我在我擁有的 Consul 包裝類中實例化了它的客戶端.由于我不維護(hù) consul 模塊,因此我無法修改源代碼以適應(yīng)我的測試(無論如何我都不想這樣做).對于它的價值,consul.Consul() 返回一個 consul 客戶端,它有一個屬性 kv - consul.Consul.KV.kv 有一個方法 get,我將它包裝在我的 Consul 類的實例方法 get_key 中.打補丁后consul.Consul調(diào)用get失敗,原因是AttributeError: Mock object has no attribute kv.

NOTE:
This is a trivial example that shows the basic problem. In reality, I am mocking a third party module.Class -- consul.Consul -- whose client I instantiate in a Consul wrapper class that I have. As I don't maintain the consul module, I can't modify the source to suit my tests (I wouldn't really want to do that anyway). For what it's worth, consul.Consul() returns a consul client, which has an attribute kv -- an instance of consul.Consul.KV. kv has a method get, which I am wrapping in an instance method get_key in my Consul class. After patching consul.Consul, the call to get fails because of AttributeError: Mock object has no attribute kv.

已檢查資源:

http://mock.readthedocs.org/en/latest/helpers.html#autospeccinghttp://mock.readthedocs.org/en/latest/patch.html

推薦答案

不,autospeccing 不能模擬在原始類的 __init__ 方法(或任何其他方法)中設(shè)置的屬性.它只能模擬出靜態(tài)屬性,所有可以在類中找到的東西.

No, autospeccing cannot mock out attributes set in the __init__ method of the original class (or in any other method). It can only mock out static attributes, everything that can be found on the class.

否則,模擬必須首先創(chuàng)建您嘗試用模擬替換的類的實例,這不是一個好主意(想想在實例化時創(chuàng)建大量實際資源的類).

Otherwise, the mock would have to create an instance of the class you tried to replace with a mock in the first place, which is not a good idea (think classes that create a lot of real resources when instantiated).

自動指定的模擬的遞歸性質(zhì)則僅限于那些靜態(tài)屬性;如果 foo 是類屬性,訪問 Foo().foo 將返回該屬性的自動指定模擬.如果你有一個 Spam 類,其 eggs 屬性是 Ham 類型的對象,那么 Spam.eggs 將是 Ham 類的自動指定模擬.

The recursive nature of an auto-specced mock is then limited to those static attributes; if foo is a class attribute, accessing Foo().foo will return an auto-specced mock for that attribute. If you have a class Spam whose eggs attribute is an object of type Ham, then the mock of Spam.eggs will be an auto-specced mock of the Ham class.

您閱讀的文檔 明確em> 涵蓋了這個:

The documentation you read explicitly covers this:

一個更嚴(yán)重的問題是,實例屬性通常在 __init__ 方法中創(chuàng)建,而根本不存在于類中.autospec 無法知道任何動態(tài)創(chuàng)建的屬性,并將 api 限制為可見屬性.

A more serious problem is that it is common for instance attributes to be created in the __init__ method and not to exist on the class at all. autospec can’t know about any dynamically created attributes and restricts the api to visible attributes.

您應(yīng)該自己設(shè)置缺少的屬性:

You should just set the missing attributes yourself:

@patch('foo.Foo', autospec=Foo)
def test_patched(self, mock_Foo):
    mock_Foo.return_value.foo = 'foo'
    Bar().bar()

或創(chuàng)建您的 Foo 類的子類用于測試目的,將屬性添加為類屬性:

or create a subclass of your Foo class for testing purposes that adds the attribute as a class attribute:

class TestFoo(foo.Foo):
    foo = 'foo'  # class attribute

@patch('foo.Foo', autospec=TestFoo)
def test_patched(self, mock_Foo):
    Bar().bar()

這篇關(guān)于修補類會產(chǎn)生“AttributeError:Mock object has no attribute";訪問實例屬性時的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Python 3 Float Decimal Points/Precision(Python 3 浮點小數(shù)點/精度)
Converting Float to Dollars and Cents(將浮點數(shù)轉(zhuǎn)換為美元和美分)
What are some possible calculations with numpy or scipy that can return a NaN?(numpy 或 scipy 有哪些可能的計算可以返回 NaN?)
Python float to ratio(Python浮動比率)
How to manage division of huge numbers in Python?(如何在 Python 中管理大量數(shù)字的除法?)
mean from pandas and numpy differ(pandas 和 numpy 的意思不同)
主站蜘蛛池模板: 久久精品在线播放 | 免费一级大片 | 国产精品免费看 | 久久久久久91香蕉国产 | 亚洲精品v日韩精品 | 国产精品欧美一区二区三区不卡 | 99精品一区二区三区 | 成人在线免费电影 | 免费观看黄网站 | 国产一区二区在线免费观看 | 国产精品久久国产精品 | 亚洲一二三区在线观看 | 丁香婷婷在线视频 | 午夜影院视频在线观看 | 热久久久 | 真人一级毛片 | 国产91久久精品一区二区 | 久久国产美女视频 | 国产精品欧美精品日韩精品 | 日韩一区二区在线播放 | 国产区在线观看 | 日韩伦理一区二区 | 久久毛片| 亚洲成人一区 | 亚洲欧美综合 | 日韩欧美中文字幕在线观看 | 成人欧美一区二区三区在线播放 | 亚洲视频一区在线观看 | 黄久久久| 青青久草| 久久视频精品在线 | 黄色精品 | 99久久免费精品国产免费高清 | 国产成在线观看免费视频 | 中文字幕亚洲精品 | 羞羞视频在线观看免费观看 | 中文字幕不卡 | 国产精品资源在线观看 | 中文字幕日本一区二区 | 国产一区二区在线免费视频 | 九七午夜剧场福利写真 |