PHP - SimpleTest - liste chaque appel aux méthodes d'un objet simulé
-
13-12-2019 - |
Question
Mon problème est que je dois énumérer chaque appel à un objet faux, car j'ai besoin de les vérifier.Je n'ai rien trouvé à propos de cette fonctionnalité dans la documentation SimpleTest.: S
Peut-être qu'il y a une autre façon de tester mon code:
class Clean_Collection_Tree_NestedArrayParser {
protected $path = array();
protected $depth = -1;
/** @var Clean_Collection_Tree_MapTreeInterface */
protected $tree;
public function setBasePath(array $path) {
$this->path = $path;
}
public function setTree(Clean_Collection_Tree_MapTreeInterface $tree) {
$this->tree = $tree;
}
public function parse($subject) {
$this->parseArray($subject);
}
public function parseArray(array $array) {
++$this->depth;
foreach ($array as $key => $value) {
$this->path[$this->depth] = $key;
if (is_array($value)) {
$this->tree->put($this->path, new Clean_Collection_Map_Map());
$this->parseArray($value);
} else
$this->tree->put($this->path, $value);
}
if (!empty($array))
array_pop($this->path);
--$this->depth;
}
}
Ceci est un analyseur qui attend un tableau imbriqué à partir de laquelle j'ai l'intention de créer un arborescence d'objets de carte.J'injecte l'arbre réel avec
interface Clean_Collection_Tree_MapTreeInterface extends Clean_Collection_CollectionInterface {
public function putAll(array $array);
public function put(array $path, $value);
public function get(array $path);
public function getAll(array $pathes);
public function removeAll(array $pathes);
public function remove(array $path);
public function contains(array $path);
}
L'analyseur utilise uniquement la
La solution
Le problème est dans la conception de la classe SimpleMock:
protected function addCall($method, $args) {
if (! isset($this->call_counts[$method])) {
$this->call_counts[$method] = 0;
}
$this->call_counts[$method]++;
}
Ils auraient dû créer une classe d'enregistrement pour la journalisation des propriétés d'appel au lieu de définir une propriété dans la SimpleMock ... Nous pouvons créer une solution de contournement en prolongeant la classe SimpleMock:
class LoggedMock extends SimpleMock {
protected $invokes = array();
public function &invoke($method, $args) {
$this->invokes[] = array($method, $args);
return parent::invoke($method, $args);
}
public function getMockInvokes() {
return $this->invokes;
}
}
et la définir comme classe de base de la base:
require_once __DIR__.'simpletest/autorun.php';
SimpleTest::setMockBaseClass('LoggedMock');
Après cela, nous pouvons obtenir la liste d'invoque avec la
edit : Nous ne pouvons pas étendre le addCall, car dans la première ligne de la méthode d'invoque, le nom de la méthode est converti en minuscule, donc en prolongeant le format complémentaire, nous ne pouvons enregistrer que le format minuscule et nonle camelcase.(Je pense que la conversion en minuscule est une erreur ...)
J'ai créé un test de démonstration:
interface Nike {
public function justDoIt();
}
class NikeUser {
protected $nike;
public function setNike(Nike $nike) {
$this->nike = $nike;
}
public function doIt() {
$this->nike->justDoIt();
}
}
Mock::generate('Nike', 'MockNike');
class NikeUserTest extends UnitTestCase {
public function testDoItButWeDontWantJustDoIt() {
$mockNike = new MockNike();
$nikeUser = new NikeUser();
$nikeUser->setNike($mockNike);
$expectedInvokes = array();
$nikeUser->doIt();
$expectedInvokes[] = array('justDoIt', array());
$this->assertEqual($expectedInvokes, $mockNike->getMockInvokes());
}
}