Sto elaborando una sequenza di oggetti definiti dall'utente. Sembra simile al seguente:Come posso affermare le chiamate che accettano gli argomenti di sequenza con Python Mock?
class Thing(object):
def __init__(self, x, y):
self.x = x
self.y = y
Il metodo attualmente sto test hanno una funzionalità simile al seguente:
def my_function(things):
x_calc = calculate_something(t.x for t in things)
y_calc = calculate_something(t.y for t in things)
return x_calc/y_calc
Il problema che sto affrontando sta testando le chiamate a calculate_something
. Voglio affermare che queste chiamate è successo, qualcosa in questo modo:
calculateSomethingMock.assert_any_call(the_sequence)
Non mi interessa circa l'ordine della sequenza passato in calculate_something
, ma io mi interessa che gli elementi sono tutti presenti. Potrei avvolgere la funzione del generatore in una chiamata a set
, ma non mi sento come se il mio test dovesse dettare quale tipo di sequenza è passato a calculate_something
. Dovrei essere in grado di passargli qualsiasi tipo di sequenza. In alternativa, potrei creare un metodo che generi la sequenza invece di usare la sintassi del generatore e simulare quel metodo, ma sembra eccessivo.
Come posso strutturare meglio questa asserzione, o il mio problema è verificare qui un'indicazione di codice mal strutturato?
Sto usando Python 2.7.3 con Mock 1.0.1.
(Per chi si sente in dovere di commentare su di esso, mi rendo conto che sto facendo ultimo test e che questo non è considerato il più grande pratica.)
Edit:
Dopo orologio this marvelous talk entitled "Why You Don't Get Mock Objects by Gregory Moeck" , Ho riconsiderato se avrei dovuto persino prendere in giro il metodo calculate_something
.
Cerco di evitare di scavare in quella lista, ma suppongo che potrebbe essere l'unico modo. Potresti fornire un esempio? – jpmc26
Grazie. Questo test si basa sul metodo che preserva l'ordine e si basa anche sul metodo che passa in una lista. Non sono molto entusiasta del test basandosi sull'ordine. Se decido di passare ad un'altra struttura dati per l'argomento passato in 'calculate_something', voglio che il test fallisca? Oppure, viceversa, se cambio il test per verificare la chiamata per un tipo di dati diverso, devo modificare il metodo per farlo passare di nuovo? – jpmc26
Sì, ma ricorda che questo è un esempio. È possibile passare a 'calculate_something' qualsiasi altra struttura di dati, basta aggiornare il test per riflettere quello (modificando i valori previsti). Vuoi che il test passi dopo tutto. Hai già visto come ottenere gli argomenti passati a 'calculate_something' usando' call_args_list'. Dopodiché, si tratta solo di confrontare i dati strutturati passati con quello che ti aspetti. –