“模拟”对象有没有属性“__getitem__”
问题描述:
下面的例子Mocking a Dictionary with MagicMock后,我有以下模拟设置:“模拟”对象有没有属性“__getitem__”
mock_writer = Mock()
mock_reader = Mock()
mock_format = Mock()
mock_option = Mock()
mock_load = MagicMock()
test_dict = {"Bus_No": Mock(), "Team_No": Mock()}
def getitem(name):
return test_dict[name]
mock_load.__getitem__.side_effect = getitem
mock_option.load.return_value = mock_load
mock_format.option.return_value = mock_option
mock_reader.format.return_value = mock_format
mock_reader.write.return_value = mock_writer
mock_spark = Mock()
mock_spark.read.return_value = mock_reader
Driver(mock_spark).run()
这里是驱动程序类:
def __init__(self, spark):
self.spark = spark
def run(self):
partition_names = ["Bus_No", "Team_No"]
df = self.spark.read\
.format("com.databricks.spark.avro")\
.option("avroSchema", schema)\
.load("{0}{1}*.avro".format(job.SourcePath, os.path.sep))
partition_columns = [df[x] for x in partition_names]
然后返回这个错误:
partition_columns = [df[x] for x in partition_names]
TypeError: 'Mock' object has no attribute '__getitem__'
答
原来,因为read
不是我守的方法ld不使用mock_spark.read
的return_value
。这是变化:
mock_spark.read = mock_reader
什么是你指的self.spark对象? –
它是对'mock_spark'对象的引用。该模拟被传递到类的'__init__'方法中,它被分配给'self.spark'。 –