2017-02-23 311 views
0

下面的例子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__' 
+0

什么是你指的self.spark对象? –

+0

它是对'mock_spark'对象的引用。该模拟被传递到类的'__init__'方法中,它被分配给'self.spark'。 –

回答

1

原来,因为read不是我守的方法ld不使用mock_spark.readreturn_value。这是变化:

mock_spark.read = mock_reader 
相关问题