我试图测试一个pandas方法是否被调用了一些值。在
然而,仅仅通过应用@patch decorator,patched方法就会在pandas中抛出一个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)
应用程序/测试/TestStockModel.py在
^{pr2}$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
默认情况下,
patch
用真正通用的模拟对象替换对象。如您所见,调用mock只会返回另一个mock。它的len
为0,即使被替换的对象没有len
。它的属性也是通用的mock。在因此,模拟行为需要额外的参数,比如:
^{pr2}$或“通过”:
在https://docs.python.org/3.5/library/unittest.mock-examples.html中有一个类似的例子
相关问题 更多 >
编程相关推荐