Стратегия для словаря с дополнительными ключами - PullRequest
0 голосов
/ 30 мая 2018

В настоящее время я использую гипотезу fixed_dictionaries для создания словаря с определенными ключами и типами данных, которые считаются действительными для моего приложения.Мне нужна стратегия, которая производит этот фиксированный словарь, а также другие с удаленными определенными ключами.Или словарь с определенным минимальным набором ключей с дополнительными дополнительными ключами, предпочтительно таким образом, чтобы создавать различные комбинации этих дополнительных ключей.

Это пример схемы json, которую необходимо проверить, с2 необязательных поля.Я хотел бы сгенерировать все возможные действительные данные для этой схемы.

'user_stub': {
    '_id':        {'type': 'string'},
    'username':   {'type': 'string'},
    'social':     {'type': 'string'},
    'api_name':   {'type':     'string',
                   'required': False},
    'profile_id': {'type':     'integer',
                   'required': False},
}

Это то, что я придумал, но это неверно, потому что он сохраняет ключи, но использует None в качестве значения, и я хочу вместо этогочто ключи удалены.

return st.fixed_dictionaries({
    '_id':        st.text(),
    'username':   st.text(),
    'social':     st.text(),
    'api_name':   st.one_of(st.none(),
                            st.text()),
    'profile_id': st.one_of(st.none(),
                            st.integers()),
})

РЕДАКТИРОВАТЬ: обновленная составная стратегия ->

Кажется, что было бы лучше отделить дополнительные необязательные словари на основе типа возвращаемых данных, в противном случаеможет получить ключи с несовпадающими значениями.

@st.composite
def generate_data(draw):
    base_data = st.fixed_dictionaries({
        '_id':      st.text(),
        'username': st.text(),
        'social':   st.text(),
    })
    optional_strs = st.dictionaries(
        keys=st.just('api_name'),
        values=st.text()
    )
    optional_ints = st.dictionaries(
        keys=st.just('profile_id'),
        values=st.integers()
    )

    b = draw(base_data)
    s = draw(optional_strs)
    i = draw(optional_ints)
    return {**b, **s, **i}  # noice

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

das-g предоставил рабочее решение!

Другим способом сделать это было бы

fixed_dictionaries(dict(
    required=text(),
    optional=none()|text(),  # note None first, for shrinking
)).map(
    lambda d: {k: v for k, v in d.items() if v is not None}
)
0 голосов
/ 30 мая 2018

Извлечение из стратегии fixed_dictionaries для необходимых записей и из стратегии словарей для дополнительных.Затем объедините их в один словарь, объединяя их.

Вы можете сделать это в своем тесте или создать составную стратегию , которая сделает это за вас.

...