2012-04-16 17 views
26

Ho letto la documentazione sull'argomento e il mio codice segue tutti i requisiti dell'implementazione di un fornitore di dati. Prima di tutto, here's the full code of the test nel caso sia pertinente.PHPUnit @dataProvider semplicemente non funziona

Ecco la funzione che implementa provider di dati:

/** 
* Test the createGroup function 
* 
* @return void 
* @author Tomas Sandven <[email protected]> 
* 
* @dataProvider provideFileImportTests_good 
**/ 
public function testCreateGroup($file, $groupname, $group, $mapping) 
{ 
    // Create a test group 
    $id = $this->odm->createGroup($groupname, $group); 

    // Try to load it back out 
    $result = R::load(OmniDataManager::TABLE_GROUP, $id); 

    // Check that the result is not null 
    $this->assertFalse(is_null($result)); 

    return $id; 
} 

PHPUnit solo fallisce:

argomento 1 per mancanza di tests \ Broadnet \ broadmap \ OmniDataManagerTest :: testCreateGroup()

Ho provato ad uccidere l'applicazione (die();) all'interno della funzione del fornitore di dati e non accade mai. La funzione del fornitore di dati è disponibile pubblicamente nella stessa classe, non ci sono errori di battitura nel nome della funzione e la funzione testCreateGroup fa riferimento ad essa nelle annotazioni nel commento, ma la funzione del fornitore di dati non viene mai chiamata.

spiegare perché

Grazie

risposta

60

Finalmente dopo ore di sollecitazione di questo file di test, ho scoperto che la semplice definizione della funzione di costruzione interrompe la funzionalità dei fornitori di dati. Buono a sapersi.

Per risolvere il problema, è sufficiente chiamare il costruttore genitore. Ecco come appariva nel mio caso:

public function __construct() 
{ 
    // Truncate the OmniDataManager tables 
    R::wipe(OmniDataManager::TABLE_GROUP); 
    R::wipe(OmniDataManager::TABLE_DATA); 

    parent::__construct(); // <- Necessary 
} 
+4

Hai anche chiamato il genitore :: __ constructor()? Di solito, non si definirà comunque un costruttore per una testcase, ma si utilizzerà la funzione setUp(). –

+1

Avevo bisogno di un codice da eseguire una volta prima di iniziare qualsiasi test. No non ho chiamato 'parent :: __ constructor()' ... Ho sostituito il costruttore con 'function setUpBeforeClass' comunque. È problematico che debba essere statico, ma fortunatamente non ho avuto bisogno di mettere niente di interessante lì – Hubro

+8

Puoi avere un costruttore personalizzato, ma devi fare attenzione ad accettare gli stessi parametri e passarli al costruttore genitore. –

2

Questo errore significa che almeno una delle schiere di dati che il metodo di dati-fornitore sta ritornando è vuota. Per esempio:

public function dataProvider() { 
    return array(
     array(1, 2, 3), 
     array(),   // this will cause a "Missing argument 1" error 
     array(4, 5, 6) 
    ); 
} 

Perché si sta generando schiere di dati in modo dinamico, è necessario eseguire il debug l'origine dati (s) e capire perché questo sarebbe il caso.

+0

Come può il provider di dati restituisce un array di dati vuota se * non è mai chiamato * – Hubro

+0

Ho copiato il funzione di provider in una nuova classe di test e ha funzionato. Il problema è da qualche altra parte nella classe – Hubro

+0

@Codemonkey: se il messaggio di errore che hai fornito proviene da un errore di test (che non posso dire perché non hai incollato nessun contesto), allora può accadere solo se un set di dati fornito a un metodo di prova è vuoto. Gli unici altri modi in cui posso pensare di non ricevere questo messaggio di errore richiederebbero il tentativo di chiamare manualmente 'testCreateGroup()' da qualche parte all'interno del codice (e quindi, non passando gli argomenti necessari) , o il test viene chiamato da PHPUnit senza essere trattato come se avesse un fornitore di dati (che indicherebbe un problema nella tua annotazione). – FtDRbwLXw6

38

Se davvero ne hai bisogno, David Harkness ha avuto il consiglio giusto. Ecco il codice:

public function __construct($name = NULL, array $data = array(), $dataName = '') { 
    $this->preSetUp(); 
    parent::__construct($name, $data, $dataName); 
} 
+5

+1, questo dovrebbe essere contrassegnato come la risposta giusta – danielperaza

+3

Questo lo risolve in modo specifico anche per me, chiamando parent :: construct() senza nessun parametro no. Grazie – scipilot

+0

Sei un vero toccasana! Grazie! – artsylar

2

Assicurarsi che dataProvider è scritto a destra ... @dataProvidor vs @dataProvider

Nella funzione di test che ha bisogno di un fornitore di dati, un docblock è necessario che contiene

/** 
* @dataProvider providerItCanTest 
*// 
0

Ciao a tutti quelli che vengono ancora da Google :) Sto usando PHP 7.0.5 e PHPUnit 5.3.2.

Come cita @hubro, non utilizzare __construct() in quanto interrompe alcune annotazioni PHPUnit. Here è un SO con più dettagli.

La classe del mio test, MyStuffTest, si estende MyFancyTestcase che si estende PHPUnit_Framework_TestCase. MyFancyTestcase utilizzato __construct() e ho ottenuto lo stesso errore. Dovrebbe utilizzare setupBeforeClass() invece di configurare i dati statici condivisi tra tutti i casi di test - connessione db e così via, senza necessità di __construct(). DataProvider funziona ora.

+0

Prima di tutto, non sto dicendo "non usare' __construct() '", ho detto che la funzione genitore deve essere chiamata o interromperà la funzionalità della classe. Inoltre, una funzione di installazione statica non può sostituire tutti i casi d'uso di '__construct()'. – Hubro

5

Per me solo la rimozione del costruttore ha funzionato. Chiamare il costruttore genitore all'interno del mio test di classe ha rotto le annotazioni anche con l'ultima versione stabile di PHPUnit (6.0.9).

Ho appena spostato il codice che avevo su __constructor nella funzione setUp chiamata prima dell'esecuzione dei test dell'unità.

1

per sottolineare il punto che ha fatto micro_user, il @dataProvider annotazioni must essere in un commento docblock. vale a dire fare questo:

/** 
* @dataProvider myDataProvider 
* 
*/ 
public function testMyMethod(...) 
{ 
    ... 
} 

Non fare questo in quanto non funziona:?

/* 
* @dataProvider myDataProvider 
* 
*/ 
public function testMyMethod(...) 
{ 
    ... 
} 
+0

hai salvato un giorno – animaacija

+0

piacere di sentirlo. :-) – darrenp

Problemi correlati