Jak zacházíte s mocky? rubrika: Programování: Jiné

3 skliblatik
položil/-a 9.4.2016

Jak zacházíte s mocky?

Jednoduchý příklad:
Pro zjednodušení neřešme okrajové případy.

def create_options(arg_list):
    options = {}
    for arg in arg_list:
        key, value = arg.split("=")
        options[key] = value
    return options
 
def prepare_something(args):
    return ("default", args[0]) if len(args) == 1 else (args[0], args[1])
 
def separate_options(arg_list):
    for i, arg in enumerate(arg_list):
        if "=" in arg:
            return arg_list[:i], arg_list[i:]
    return arg_list, []
 
def parse_args(args):
    something_args, option_args = separate_options(args)
    category, something = prepare_something(something_args)
    return {
        "category": category,
        "something": something,
        "options": create_options(option_args)
    }

Předpokládejme, že create_options, prepare_something, separate_options mají své unittesty.

Otázka zní, jak testovat funkci parse_args. Jistě je možné testovat tak, že zadám vstupy a porovnám výstupy. Tímto ale budu testovat i ty tři již otestované funkce a v případě rozbití jedné z funkcí budou padat i tyto testy.

Nebo můžu použít mocky na opatchování tří již otestovaných funkcí a testovat opravdu jen parse_args. Jenže když bych refaktoroval funkci parse_args, tak mi takové testy moc nepomůžou.

V tomto případě bych se pravděpodobně rozhodl pro testování vstupů a výstupů bez mockování, protože účelem parse_args je spíš transformace vstupu, než komponování funkcí. Ale nemusí to být vždy průhledné. Mate pro to nějaká pravidla? Nebo mockujete jen vedlejší efekty?

odkaz
12 Kit
odpověděl/-a 9.4.2016

Problém je v tom, že funkce parse_args() má skryté závislosti, před kterými mají unittesty chránit. Je to jen důsledek toho, že jsi nejprve napsal kód a teprve pak k němu píšeš testy. Tedy přesně obráceně.

Všechny 4 funkce jsou ve své podstatě jednou jednotkou. Volané funkce by tedy měly být zapouzdřeny uvnitř funkce parse_args() a pouze na tuto vnější funkci by se měly psát jednotkové testy. Mocky pak nebudou potřebné.

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.