Тестовый паркет с питоном - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь смоделировать parquet и утверждать, что он вызывается с правильным путем, но возникают проблемы с корректной имитацией. Как я могу издеваться над функцией option, чтобы вернуть мне поддельный parquet?

проверяемый код

def read_from_s3(spark, path):
    return spark.read.option('mergeSchema', 'true').parquet(path)

Проверка

import unittest
import mock
from src.read_from_s3 import read_from_s3


class TestReadFromS3(unittest.TestCase):
    def test_read_from_s3__called_with_correct_params(self):
        spark = mock.MagicMock()
        spark.read.option = mock.MagicMock()
        spark.read.option.parquet = mock.MagicMock()
        path = 'my_path'

        read_from_s3(spark, path)

        spark.read.option.assert_called_with('mergeSchema', 'true') # this passes
        spark.read.option.parquet.assert_called_with(path) # this fails

Неудачный тест

AssertionError: Expected 'parquet' to have been called once. Called 0 times.

1 Ответ

1 голос
/ 03 октября 2019

parquet не является атрибутом spark.read.option;это атрибут возвращаемого значения из option. Кроме того, вам не нужно явно создавать макеты;поиск атрибутов на макете также возвращает макет.

def test_read_from_s3__called_with_correct_params(self):
    spark = mock.MagicMock()
    read_from_s3(spark, path)
    spark.read.option.assert_called_with('mergeSchema', 'true')
    spark.read.option.return_value.parquet.assert_called_with(path)
...