{"id":105,"date":"2012-02-08T23:34:07","date_gmt":"2012-02-08T22:34:07","guid":{"rendered":"http:\/\/www.pfft.ch\/wordpress\/?p=105"},"modified":"2012-02-08T23:37:20","modified_gmt":"2012-02-08T22:37:20","slug":"cakephp-constructor-im-appcontroller-verwenden","status":"publish","type":"post","link":"https:\/\/www.pfft.ch\/wordpress\/2012\/02\/cakephp-constructor-im-appcontroller-verwenden\/","title":{"rendered":"[CakePHP] Constructor im AppController verwenden"},"content":{"rendered":"<p>In den beiden vorherigen Artikeln (<a href=\"http:\/\/www.pfft.ch\/wordpress\/2012\/02\/cakephp-teste-controller-die-cakeemail-verwenden\/\">Artikel 1<\/a> \/ <a href=\"http:\/\/www.pfft.ch\/wordpress\/2012\/02\/cakephp-auf-ein-neues-controller-testen-cakeemail-verwenden\/\">Artikel 2<\/a>) habe ich \u00fcber die M\u00f6glichkeiten zum Testen von Controllern geschrieben, welche die Klasse CakeEmail verwenden. Leider traten damit Probleme auf, sobald ich die wunderbare Welt des Entwicklers und der Testumgebung verlassen habe und die Applikation als solches habe laufen lassen.<!--more--><\/p>\n<p>Im ersten Artikel habe ich erw\u00e4hnt, dass die Deklaration der protected-Variable $email und ihrer Definition im Konstruktor der Klasse AppController erfolgen kann. Leider stimmt das so nicht. Es ergeben sich nur Probleme, wenn die Klasse AppController einen Konstruktor enth\u00e4lt. Der folgende Aufruf l\u00e4sst die Applikation nicht mehr starten:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nApp:Uses('Controller', 'Controller');\r\n\r\nclass AppController extends Controller\r\n{\r\n    public function __construct()\r\n    {\r\n        parent::construct();\r\n        \/\/ Some more code or not, it doesn't matter\r\n    }\r\n}\r\n<\/pre>\n<p>Um ein Verhalten zu bekommen, dass der Erwartung des oben gezeigten nahe kommt, soll auf die Erstellung eines Konstruktors in der Klasse AppController verzichtet werden und stattdessen die Methode beforeFilter() \u00fcberschrieben werden (Quelle leider verloren \ud83d\ude41 )<\/p>\n<p>Auf jeden Fall funktionieren meine Tests dadurch nicht mehr. Die einzige Abhilfe ist das Verschieben der $email-Variable und des Konstruktors von der AppController-Klasse in jede Klasse, in der die CakeEmail-Klasse verwendet wird.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n\r\nclass UsersController extends AppController\r\n{\r\n    protected $email;\r\n\r\n    public function __construct()\r\n    {\r\n        parent::__construct();\r\n        $this-&gt;email = new CakeEmail('gmail');\r\n    }\r\n...\r\n<\/pre>\n<p>Ein Problem bestand aber weiterhin: Durch die Verwendung von &#8222;<a href=\"http:\/\/sebastian-bergmann.de\/archives\/563-Fluent-Interface-in-PHPUnit-3.0.html\">Fluent Interface<\/a>&#8220; in PHPUnit wird im Fall von komplett gemockten CakeEmail-Objekten (siehe Artikel 2) erwartet, dass Aufrufe wie z.B.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">to()<\/pre>\n<p>oder<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">subject()<\/pre>\n<p>eine Referenz auf das Objekt selber zur\u00fcckgeben. Wir nun ein CakeEmail-Objekt gemockt<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">$Users-&gt;email = $this-&gt;getMock('CakeEmail');<\/pre>\n<p>gibt die erste aufgerufene Methode im Controller nichts zur\u00fcck und der Aufruf der zweiten Methode schl\u00e4gt mit einer Exception fehl.<\/p>\n<p>Um dieses Problem zu l\u00f6sen m\u00fcssen entweder alle R\u00fcckgabewerte alle verwendeten Aufrufe im Test \u00fcberschrieben werden (argh, gibt das viel zu tun), oder aber es wird nur die Methode &#8217;send&#8216; der CakeEmail-Klasse gemockt:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$Users-&gt;email = $this-&gt;getMock('CakeEmail', array('send'));\r\n\r\n$Users-&gt;email\r\n    -&gt;expects($this-&gt;once())\r\n    -&gt;method('send');\r\n<\/pre>\n<p>Ich hoffe, ich konnte Eure Probleme dadurch l\u00f6sen!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In den beiden vorherigen Artikeln (Artikel 1 \/ Artikel 2) habe ich \u00fcber die M\u00f6glichkeiten zum Testen von Controllern geschrieben, welche die Klasse CakeEmail verwenden. Leider traten damit Probleme auf, sobald ich die wunderbare Welt des Entwicklers und der Testumgebung verlassen habe und die Applikation als solches habe laufen lassen.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-105","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/posts\/105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/comments?post=105"}],"version-history":[{"count":13,"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/posts\/105\/revisions"}],"predecessor-version":[{"id":118,"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/posts\/105\/revisions\/118"}],"wp:attachment":[{"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/media?parent=105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/categories?post=105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pfft.ch\/wordpress\/wp-json\/wp\/v2\/tags?post=105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}