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

修補類會產生“AttributeError:Mock object has no attrib

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

問題描述

問題
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;它調用屬于 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 通過),但是當我嘗試使用 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'

確實,當我打印出 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,補丁規范應該遞歸應用.既然 foo 確實是 Foo 實例的一個屬性,難道不應該打補丁嗎?如果沒有,我如何讓 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 包裝類中實例化了它的客戶端.由于我不維護 consul 模塊,因此我無法修改源代碼以適應我的測試(無論如何我都不想這樣做).對于它的價值,consul.Consul() 返回一個 consul 客戶端,它有一個屬性 kv - consul.Consul.KV.kv 有一個方法 get,我將它包裝在我的 Consul 類的實例方法 get_key 中.打補丁后consul.Consul調用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__ 方法(或任何其他方法)中設置的屬性.它只能模擬出靜態屬性,所有可以在類中找到的東西.

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.

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

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).

自動指定的模擬的遞歸性質則僅限于那些靜態屬性;如果 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:

一個更嚴重的問題是,實例屬性通常在 __init__ 方法中創建,而根本不存在于類中.autospec 無法知道任何動態創建的屬性,并將 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.

您應該自己設置缺少的屬性:

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()

或創建您的 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()

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

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

相關文檔推薦

Python 3 Float Decimal Points/Precision(Python 3 浮點小數點/精度)
Converting Float to Dollars and Cents(將浮點數轉換為美元和美分)
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 中管理大量數字的除法?)
mean from pandas and numpy differ(pandas 和 numpy 的意思不同)
主站蜘蛛池模板: 日韩中文字幕一区二区 | 中文字幕在线视频一区二区三区 | 自拍偷拍视频网 | 久草福利 | 国产小视频在线 | 亚洲精品成人av久久 | 久久亚洲一区 | 国产精品1区2区3区 一区中文字幕 | 国产国拍亚洲精品av | 久久久精| 日本三级黄视频 | 超碰国产在线 | 国产一二区视频 | 久久久久久国产 | 久久久www成人免费无遮挡大片 | 久久人人爽人人爽人人片av免费 | 国产精品美女在线观看 | av影音资源 | 日韩av美女电影 | 亚洲成人精品免费 | 成人免费福利视频 | 国产精品久久国产精品久久 | 青春草国产 | 先锋影音资源网站 | 国产免费人成xvideos视频 | 中文字幕视频免费 | 日韩精品久久久 | 久久精品久久综合 | 国产精品美女在线观看 | 91原创视频 | 91文字幕巨乱亚洲香蕉 | 久久91精品国产一区二区 | 伊人性伊人情综合网 | 久久偷人| 日韩精品不卡 | 91干b| 黄视频网址 | 国产一区二区久久 | 国产在线精品一区二区三区 | 在线欧美一区 | www久久国产 |