簡體   English   中英

python類方法模擬失敗

[英]python class method mocking failure

試圖理解模擬/補丁,我有一個寧靜的API項目,其中包含三個文件(僅供參考,我正在使用flask)

  1. class1.py
  2. domain.py
  3. test_domain.py

class1.py文件內容:

class one:
    def addition(self):
       return 4+5

domain.py文件內容:

from class1 import one

class DomainClass(Resource):

    def post(self):

        test1 = one()
        val = test1.addition()

        return {'test' : val } 

test_domain.py文件內容:

import my_app
from flask_api import status
from mock import patch

app = my_app.app.test_client()

def test_post():
    with patch('domain.one') as mock:
        instance = mock.return_value
        instance.addition.return_value = 'yello'

    url = '/domain'
    response = app.post(url)
    print response.data

    assert status.HTTP_200_OK == response.status_code
    assert mock.called

對於我的test_domain.py文件,我也嘗試過此方法...

@patch('domain.one')
def test_post(mock_domain):
    mock_domain.addition.return_value = 1

    url = '/domain'
    response = app.post(url)
    print response.data

    assert status.HTTP_200_OK == response.status_code

我對200個通過狀態的主張是,但是,問題是我無法模擬或修補加法以使我的值為1而不是9(4 + 5)。 我也嘗試做“斷言嘲諷”,它也失敗了。 我知道我應該在使用'one()'方法的地方進行模擬/修補,即在domain.py中而不是在class1.py中。 但是我什至嘗試模仿class1.one代替domain.one,但我仍然一直得到9而不是1。我在做什么錯?

********更新我在同一問題上遇到了另一個難題,我嘗試在test_domain文件中執行此操作,而不是進行修補。

from common.class1 import one
def test_post():
    one.addition = MagicMock(return_value=40)

    url = '/domain'
    response = app.post(url)
    print response.data

    assert status.HTTP_200_OK == response.status_code

  1. 在上面的更新中,我沒有在使用它的地方進行過模擬(即:domain.one.addition = MagicMock(...),並且仍然有效!!!!看來它正在進行全局更改。為什么這項工作?

  2. 在上面的示例中,“ one”是模塊class1.py中的類。 如果我將此類“ one”更改為class1.py中的函數,則無法進行模擬。 似乎不能像這樣嘲笑模塊class1.py中的函數“ one” ... one.return_value ='xyz',為什么? 可以在全球范圍內嘲笑嗎?

您的代碼中存在一些問題。 在第一個示例中,您忘記了patch() with上下文with應用,並且上下文結束時恢復了原始代碼。 遵循代碼應該可以工作:

def test_post():
    with patch('domain.one') as mock:
        instance = mock.return_value
        instance.addition.return_value = 'yello'
        url = '/domain'
        response = app.post(url)
        print response.data
        assert status.HTTP_200_OK == response.status_code
        assert mock.called
        assert response.data['test'] == 'yello'

第二個還有另一個問題:如果只想addition補丁,則應該使用:

@patch('domain.one.addition')
def test_post(mock_addition):
    mock_addition.return_value = 1
    ...
    assert mock_addition.called
    assert response.data['test'] == 1

如果要模擬所有one ,則應像第一個示例中那樣設置mock_domain調用返回模擬實例addition的返回值:

@patch('domain.one')
def test_post(mock_domain):
    mock_addition = mock_domain.return_value.addition
    mock_addition.return_value = 1
    ...
    assert mock_addition.called
    assert response.data['test'] == 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM