Mocks переопределяет return_value других mocks - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть следующий метод внутри файла с именем another_module

def convert(cluster_id, company_id, fieldfile, sfile, unitfile, outfile, tz=None):
    with open_write(outfile) as of:
        with open_read(unitfile) as uf, open_read(fieldfile) as ff, open_read(sfile) as sf:
            units = load_units(uf)
            fields = load_fields(ff)
            csvreader = csv.DictReader(sf)

Итак, я хочу смоделировать units, fields и csvreader значения. Я делаю это следующим образом в тесте, помещенном отдельно:

@mock.patch('another_module.load_units')
@mock.patch('another_module.load_fields')
@mock.patch('another_module.csv')
def test(load_units_mock, load_fields_mock, csv_mock):
    load_units_mock.return_value = 4
    load_fields_mock.return_value = 5
    csv_mock.DictReader.return_value = 6    

    convert(
        8,
        281,
        os.path.join(TESTS_DIR, 'fourseasons.field.csv.xz'),
        os.path.join(TESTS_DIR, 'fourseasons.survey.20180301-20180302.csv.xz'),
        os.path.join(TESTS_DIR, 'fourseasons.unit.csv.xz'),
        o.name,
        pytz.timezone('America/Los_Angeles')
    )

Затем я получаю значения units=4, fields=5, csvreader=<MagicMock name=\'csv.DictReader()\' id=\'4405996288\'>

С другой стороны, если я переписываю макет csvreader следующим образом:

@mock.patch('another_module.load_units')
@mock.patch('another_module.load_fields')
def test(load_units_mock, load_fields_mock):
    load_units_mock.return_value = 4
    load_fields_mock.return_value = 5


    with patch('another_module.csv') as csv_mock:
        csv_mock.DictReader.return_value = 6    

        convert(
            8,
            281,
            os.path.join(TESTS_DIR, 'fourseasons.field.csv.xz'),
            os.path.join(TESTS_DIR, 'fourseasons.survey.20180301-20180302.csv.xz'),
            os.path.join(TESTS_DIR, 'fourseasons.unit.csv.xz'),
            o.name,
            pytz.timezone('America/Los_Angeles')

Затем units=4, fields=[realvalue], csvreader=6

Знаете ли вы, как правильно установить 3 значения, как я хочу? Что я делаю не так?

...