2017-04-07 1 views
2

En tant que nouveau venu à meck, j'ai mis en place un test qui montre les différentes fonctionnalités. Cependant, je ne comprends pas pourquoi un développeur pourrait appeler meck: validate. Voici mon exemple:Quel est le but de meck: valider?

-module(meck_demo). 

-include_lib("eunit/include/eunit.hrl"). 

validate_is_of_limited_use_test_() -> 
    { foreach, fun setup_mock/0, fun cleanup_mock/1, 
     [fun validate_does_not_fail_if_a_function_is_not_called/0, 
     fun validate_does_not_fail_if_a_function_is_called_with_wrong_arity/0, 
     fun validate_does_not_fail_if_an_undefined_function_is_called/0, 
     fun validate_does_fail_if_a_function_was_called_with_wrong_argument_types/0, 
     fun validate_does_fail_if_expectation_throws_an_unexpected_exception/0 ]}. 

validate_does_not_fail_if_a_function_is_not_called() -> 
    meck:expect(womble, name, fun() -> "Wellington" end), 
    ?assert(meck:validate(womble)). 

validate_does_not_fail_if_a_function_is_called_with_wrong_arity() -> 
    meck:expect(womble, name, fun() -> "Madame Cholet" end), 
    ?assertError(undef, womble:name(unexpected_arg)), 
    ?assert(meck:validate(womble)). 

validate_does_not_fail_if_an_undefined_function_is_called() -> 
    ?assertError(undef, womble:fly()), 
    ?assert(meck:validate(womble)). 

validate_does_fail_if_a_function_was_called_with_wrong_argument_types() -> 
    meck:expect(womble, jump, fun(Height) when Height < 1 -> 
           ok 
           end), 
    ?assertError(function_clause, womble:jump(999)), 
    ?assertNot(meck:validate(womble)). 

validate_does_fail_if_expectation_throws_an_unexpected_exception() -> 
    meck:expect(womble, jump, fun(Height) -> 42 = Height end), 
    ?assertError({badmatch, 999}, womble:jump(999)), 
    ?assertNot(meck:validate(womble)). 

setup_mock() -> 
    meck:new(womble, [non_strict]). 

cleanup_mock(_SetupResult) -> 
    meck:unload(womble). 

Qu'est-ce qui me manque?

- Mise à jour pour tenir compte des cas qu'Adam explique peut être pris

Répondre

2

Vous avez réussi à frapper à peu près tous les cas non couverts par validate (ajouté une meilleure documentation en 10c5063).

Valider peut détecter:

  • Lorsqu'une fonction a été appelée avec les types d'arguments faux (function_clause)
  • Quand une exception a été lancée
  • Quand une exception a été levée et prévu (par meck:exception/2), qui a toujours comme étant true retour de meck:validate/1

Valider ne peut pas détecter:

  • Lorsque vous ne l'avez pas appeler une fonction
  • Lorsque vous avez appelé une fonction du nombre d'arguments incorrect
  • Si vous avez appelé une fonction non définie

La raison pour laquelle il ne peut pas détecter ces cas est à cause de la façon dont Mock est mis en œuvre. Meck remplace le module par un faux et un processus qui maintient le faux. Tout ce que Meck reçoit passe par ce faux module. Meck ne s'insère pas au niveau de l'appelant (c'est-à-dire dans votre module ou dans votre cas de test), il ne peut donc pas savoir que vous n'avez pas réussi à appeler un module. Toutes les erreurs dans votre cas de test ci-dessus n'atteignent jamais le module fictif en premier lieu.

+0

Merci Adam - c'est très utile. L'explication que vous avez donnée quant à la raison pour laquelle Meck ne peut pas détecter certains abus est logique. J'ai mis à jour ma question pour refléter les exemples que vous avez fournis. Dans les cas où validate * does * échoue, le test démontre également l'échec de toute façon (assertError). Donc, je ne comprends toujours pas pourquoi un codeur appelle réellement valider. – MrBlueSky

+0

Je suis d'accord que son utilisation est limitée. Un cas d'utilisation serait que votre code testé ne tombe pas en panne, mais attrape en interne trop d'exceptions. Dans ce cas, si votre maquette n'est pas appelée correctement, vous pouvez utiliser Meck pour savoir si votre code devrait avoir planté ou non. –