Laravel test d'unité des contrôleurs
J'essaie de lancer une nouvelle application Laravel suivantes TDD
Ma première étape est de vérifier que le /login contrôleur est appelé la maison de l'url.
En dépit de plusieurs tutoriels je ne peux pas obtenir le test fonctionne et je ne vois pas ce que je fais mal.
Mon set up est:
compositeur pour installer laravel
compositeur installer phpunit
voici mon itinéraire:
<?php
Route::get('/login', 'AuthenticationController@login');
mon contrôleur:
<?php
class AuthenticationController extends BaseController {
public function login () {
return View::make('authentication.login');
}
}
Et mon test:
<?php
class AuthenticationTest extends TestCase {
public function testSomeTest () {
$response = $this->action('GET', 'AuthenticationController@login');
$view = $response->original;
$this->assertEquals('authentication.login', $view['name']);
}
}
L'erreur que j'obtiens est
ErrorException: Undefined index: name
Le code comme une copie (à peu près exactement) à partir de la Laravel site, mais il ne fonctionne pas.
N'importe qui peut voir ce que je fais mal?
Il prétend $view n'a pas de nom de l'index, mais qui peut ne pas être juste comme l'exemple sur la laravel site web, ainsi que la vue est rendu à l'aide de son nom (il affiche correctement sur l'extrémité avant trop)
EDIT::
Il semble donc à partir d'un commentaire que le laravel tests unitaires de l'article n'est pas clair et que le $view['nom'] est la vérification de la variable $nom. Si c'est le cas, comment faites-vous tester le contrôleur/itinéraire utilisé, c'est à dire. ce contrôleur nom/nom d'action a été utilisée pour la route('X')
$view['name']
n'est pas le nom de la vue, mais la variable $name
qui est disponible sur votre vue. Mais vous n'avez pas passer quoi que ce soit. Dans votre contrôleur, il faut par exemple return View::make('authentication.login')->with('name', 'John');
, et puis vous voulez tester si $name
est disponible à partir de la vue et contient "John": $this->assertEquals('John', $view['name']);
.Vraiment? Puis les docs sont trompeuses. Alors, comment puis-je tester que mon contrôleur je le feu sur une certaine route? Ou comment aurais-je obtenir le nom du contrôleur/action utilisé pour un certain itinéraire?
Je ne suis pas tout à fait sûr de ce que vous essayez d'atteindre. Si vous voulez de l'unité de test de votre application, il ne s'agit pas de tester si un itinéraire appelle la bonne méthode de contrôleur ou le contrôleur de charge la vue correcte. Cela fait partie de Laravel de la fonctionnalité et il est déjà testé. Vous voulez tester si le droit des méthodes au sein de votre contrôleur sont appelés et que la réponse est. Vous n'avez pas besoin de test de la route que les appels qui contrôleur de méthode, il vous suffit d'appeler la route qui déclenche la méthode de contrôleur que vous voulez vraiment tester.
Je suppose que ça a du sens. ma pensée était que l'id d'écrire un test que l'action login serait appelé formulaire par défaut/home route. ensuite, je voudrais vérifier qu'un autre itinéraire redirigé vers la de login d'itinéraire SI l'utilisateur n'est pas connecté. mais Si je ne peux pas obtenir l'itinéraire ou le contrôleur utilisé comment pourrais-je tester si un utilisateur non autorisé a été redirigé vers la de login/itinéraire contrôleur? Je suppose que $response = $this->call('GET', 'admin/users'); $this->assertRedirectedTo('admin/login'); est la seule chose que je peux faire (bien qu'il ne faire ce que je veux.
Oui, parce que c'est ce que vous voulez tester. Dans votre unité de test, tout ce que vous voulez savoir, c'est si les actions sont déclenchées selon que l'utilisateur est connecté ou non. Dans votre cas, vous vérifiez si la réponse est une redirection vers un certain itinéraire. Et c'est tout. Vous ne vous souciez pas ce qui se passe après ou le contrôleur est appelé - delà de la portée de votre unité de test. Vous voulez juste pour vérifier si votre application vous donne les réponses attendues pour la donnée d'entrée. Configurer un utilisateur authentifié, l'appel de la route et de vérifier si vous êtes redirigé vers 'admin/users', sinon, par exemple, à 'l'utilisateur/login'.
OriginalL'auteur atmd | 2014-07-22
Vous devez vous connecter pour publier un commentaire.
Ok, comme déjà expliqué un peu dans les commentaires, nous allons tout d'abord prendre du recul et à réfléchir sur le scénario.
Ce qui signifie que: Lorsque l'utilisateur accède à la maison de la route, vous voulez vérifier si l'utilisateur est connecté. Si il ne l'est pas, vous voulez rediriger vers la de login, peut-être avec quelques message flash. Après avoir ouvert une session, vous souhaitez rediriger vers la page d'accueil. Si la connexion échoue, vous souhaitez rediriger vers le formulaire de connexion, peut-être aussi avec un message flash.
Il ya donc plusieurs choses à tester maintenant: La maison et le contrôleur de connexion du contrôleur. Suite à l'ATS esprit, nous allons créer les premiers tests.
Note: je vais suivre quelques-convention de nommage qui est utilisé par phpspec, mais ne laissez pas cela vous dérange.
Et c'est tout pour la Maison contrôleur. Dans la plupart des cas, vous avez réellement n'avez pas de soins où vous êtes redirigé vers, parce que cela peut changer au fil du temps et vous aurez à changer les tests. De sorte que le moins que vous devez faire est de vérifier si vous êtes redirigés ou non, et non seulement de vérifier pour plus de détails, si vous pensez vraiment que c'est important pour votre test.
Nous allons avoir un regard sur le contrôleur de l'Authentification:
De nouveau, toujours penser à ce que vous voulez vraiment tester. Avez-vous vraiment besoin de savoir qui contrôleur de l'action est déclenchée sur la route? Ou quel est le nom de la vue est retourné? En fait, vous avez juste besoin de s'assurer que le contrôleur fait tentatives de le faire. Vous transmettre certaines données, puis de tester si il se comporte comme prévu.
Et assurez-vous toujours que vous n'êtes pas en train de tester tout cadre de fonctionnalités, par exemple si un itinéraire spécifique déclenche une action spécifique ou si une Vue est correctement chargé. Cela a déjà été testé, donc vous n'avez pas besoin de s'inquiéter à ce sujet. Se concentrer sur les fonctionnalités de votre application, et non sur le cadre sous-jacent.
Auth::shouldReceive('check')
méthode? Quand j'ai essayé d'exécuter votre méthode d'essai avec cette méthode je obtenirdriver() does not exist on this mock object
Oui, il fonctionne très bien, et c'est documenté la façon de se moquer de façades: laravel.com/docs/5.1/testing#mocking-facades. On dirait que vous n'avez pas de session ou auth ensemble de pilotes.
Merci pour la réponse rapide. Ouais j'ai personnalisé auth pilote. Savez-vous comment puis se moquer de méthode de contrôle et pilote personnalisé?
Désolé, je ne connais pas trop à ce sujet. Peut-être à la recherche à la façon dont le cadre lui-même ne pourrait vous aider: github.com/laravel/framework/blob/5.1/src/Illuminate/Support/... bref, il vient de swaps de la 'auth' récipient de liaison avec un simulacre. En fait, cela devrait fonctionner pour tout conducteur... Mais je n'ai jamais travaillé avec d'autres pilotes, je crains que je ne peux pas vraiment vous aider.
Ouais, c'est peut-être aussi des problème avec la Session pilote comme vous l'avez mentionné. Quand j'ai essayer avec
Auth attempt
méthode fonctionne très bien. Quelle est la meilleure façon de se moquer de la Session pilote?OriginalL'auteur Quasdunk