2017-02-23 10 views
0

Nachdem nach dem Beispiel Mocking a Dictionary with MagicMock ich habe folgenden Mock-Setup:'Mock' Objekt hat kein Attribut '__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() 

Und hier die Fahrer-Klasse ist:

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] 

Und es gibt dann Dieser Fehler:

partition_columns = [df[x] for x in partition_names] 
TypeError: 'Mock' object has no attribute '__getitem__' 
+0

Was ist das self.spark-Objekt, auf das Sie sich beziehen? –

+0

Es ist ein Verweis auf das 'mock_spark' -Objekt. Der Mock wird in die Methode "__init__" der Klasse übergeben, in der er "self.spark" zugewiesen ist. –

Antwort

1

Stellt sich heraus, dass, weil read ist keine Methode ich Shou Ich verwende nicht return_value von mock_spark.read. Hier ist die Änderung:

mock_spark.read = mock_reader 
Verwandte Themen