Gra*_*man 1 python patch mocking pandas
我正在尝试测试是否使用某些值调用 pandas 方法。
然而,仅仅通过应用 @patch 装饰器就会导致修补的方法在 pandas 中抛出 a ValueError,而实际方法不会。我只是想测试正在Stock.calc_sma调用底层pandas.rolling_mean函数。
我假设@patch装饰器基本上向我正在修补的东西添加了一些“神奇”方法,这些方法允许我检查函数是否被调用。如果是这种情况,为什么pandas.rolling_mean无论修补与未修补该函数的行为不一样?
应用程序/模型.py
import pandas as pd
class Stock: # i've excluded a bunch of class methods, including the one that sets self.data, which is a DataFrame of stock prices.
def calc_sma(self, num_days)
if self.data.shape[0] > num_days: # Stock.data holds a DataFrame of stock prices
column_title = 'sma' + str(num_days)
self.data[column_title] = pd.rolling_mean(self.data['Adj Close'], num_days)
Run Code Online (Sandbox Code Playgroud)
应用程序/测试/TestStockModel.py
def setUp(self):
self.stock = MagicMock(Stock)
self.stock.ticker = "AAPL"
self.stock.data = DataFrame(aapl_test_data.data)
@patch('app.models.pd.rolling_mean')
def test_calc_sma(self, patched_rolling_mean):
Stock.calc_sma(self.stock, 3)
assert(isinstance(self.stock.data['sma3'], Series))
patched_rolling_mean.assert_any_call()
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
File "/Users/grant/Code/python/chartflux/env/lib/python2.7/site-packages/mock.py", line 1201, in patched
return func(*args, **keywargs)
File "/Users/grant/Code/python/chartflux/app/tests/TestStockModel.py", line 26, in test_calc_sma
Stock.calc_sma(self.stock, 3)
File "/Users/grant/Code/python/chartflux/app/models.py", line 27, in calc_sma
self.data[column_title] = pd.rolling_mean(self.data['Adj Close'], num_days)
File "/Users/grant/Code/python/chartflux/env/lib/python2.7/site-packages/pandas/core/frame.py", line 1887, in __setitem__
self._set_item(key, value)
File "/Users/grant/Code/python/chartflux/env/lib/python2.7/site-packages/pandas/core/frame.py", line 1967, in _set_item
value = self._sanitize_column(key, value)
File "/Users/grant/Code/python/chartflux/env/lib/python2.7/site-packages/pandas/core/frame.py", line 2017, in _sanitize_column
raise ValueError('Length of values does not match length of '
ValueError: Length of values does not match length of index
Run Code Online (Sandbox Code Playgroud)
>>> import os
>>> os.getcwd()
'/'
>>> from unittest.mock import patch
>>> with patch('os.getcwd'):
... print(os.getcwd)
... print(os.getcwd())
... print(len(os.getcwd()))
...
<MagicMock name='getcwd' id='4472112296'>
<MagicMock name='getcwd()' id='4472136928'>
0
Run Code Online (Sandbox Code Playgroud)
默认情况下,patch用真正通用的模拟对象替换事物。如您所见,调用模拟只会返回另一个模拟。len即使被替换的对象没有 .它的 .也为 0 len。它的属性也是通用的模拟。
因此,要模拟行为需要额外的参数,例如:
>>> with patch('os.getcwd', return_value='/a/wonderful/place'):
... os.getcwd()
...
'/a/wonderful/place'
Run Code Online (Sandbox Code Playgroud)
或者“通过”:
>>> _cwd = os.getcwd
>>> with patch('os.getcwd') as p:
... p.side_effect = lambda: _cwd()
... print(os.getcwd())
...
/
Run Code Online (Sandbox Code Playgroud)
https://docs.python.org/3.5/library/unittest.mock-examples.html中有一个类似的例子
| 归档时间: |
|
| 查看次数: |
1959 次 |
| 最近记录: |