From 70299bc4c802d455761ee44738840402a57e4a07 Mon Sep 17 00:00:00 2001 From: Trismegiste Date: Sat, 24 Aug 2013 00:20:07 +0200 Subject: [PATCH 1/3] PSR-0 compliance --- Observer/{Observer.php => User.php} | 29 ++++++----------------------- Observer/UserObserver.php | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 23 deletions(-) rename Observer/{Observer.php => User.php} (64%) create mode 100644 Observer/UserObserver.php diff --git a/Observer/Observer.php b/Observer/User.php similarity index 64% rename from Observer/Observer.php rename to Observer/User.php index 1cb07dc..07dd718 100644 --- a/Observer/Observer.php +++ b/Observer/User.php @@ -1,30 +1,16 @@ notify(); } + } -$user = new User(); -$user->attach(new UserObserver()); - -$user->notify(); diff --git a/Observer/UserObserver.php b/Observer/UserObserver.php new file mode 100644 index 0000000..4da321f --- /dev/null +++ b/Observer/UserObserver.php @@ -0,0 +1,26 @@ + Date: Sat, 24 Aug 2013 00:20:47 +0200 Subject: [PATCH 2/3] unit testing with PHPUnit --- Tests/Observer/ObserverTest.php | 53 +++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Tests/Observer/ObserverTest.php diff --git a/Tests/Observer/ObserverTest.php b/Tests/Observer/ObserverTest.php new file mode 100644 index 0000000..79bf61a --- /dev/null +++ b/Tests/Observer/ObserverTest.php @@ -0,0 +1,53 @@ +observer = new UserObserver(); + } + + public function testNotify() + { + $this->expectOutputString('DesignPatterns\Observer\User has been updated'); + $subject = new User(); + + $subject->attach($this->observer); + $subject->property = 123; + } + + public function testAttachDetach() + { + $subject = new User(); + $this->assertAttributeEmpty('_observers', $subject); + $subject->attach($this->observer); + $this->assertAttributeNotEmpty('_observers', $subject); + $subject->detach($this->observer); + $this->assertAttributeEmpty('_observers', $subject); + } + + public function testUpdateCalling() + { + $subject = new User(); + $observer = $this->getMock('SplObserver'); + $subject->attach($observer); + + $observer->expects($this->once()) + ->method('update') + ->with($subject); + + $subject->notify(); + } + +} \ No newline at end of file From 99c181f975d032c2dbd15418bbf1d3be375634c8 Mon Sep 17 00:00:00 2001 From: Trismegiste Date: Sat, 24 Aug 2013 00:24:30 +0200 Subject: [PATCH 3/3] some explanations --- Observer/User.php | 2 +- Observer/UserObserver.php | 6 ++++++ Tests/Observer/ObserverTest.php | 9 +++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Observer/User.php b/Observer/User.php index 07dd718..3b41867 100644 --- a/Observer/User.php +++ b/Observer/User.php @@ -5,7 +5,7 @@ namespace DesignPatterns\Observer; /** * Observer pattern : The observed object (the subject) * - * The subject maintains a list of Observer and send notificiations. + * The subject maintains a list of Observers and sends notifications. * */ class User implements \SplSubject diff --git a/Observer/UserObserver.php b/Observer/UserObserver.php index 4da321f..3cb8b9a 100644 --- a/Observer/UserObserver.php +++ b/Observer/UserObserver.php @@ -18,6 +18,12 @@ namespace DesignPatterns\Observer; class UserObserver implements \SplObserver { + /** + * This is the only method to implement as an observer. + * It is called by the Subject (usually by SplSubject::notify() ) + * + * @param \SplSubject $subject + */ public function update(\SplSubject $subject) { echo get_class($subject) . ' has been updated'; diff --git a/Tests/Observer/ObserverTest.php b/Tests/Observer/ObserverTest.php index 79bf61a..7c12bc8 100644 --- a/Tests/Observer/ObserverTest.php +++ b/Tests/Observer/ObserverTest.php @@ -18,6 +18,9 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $this->observer = new UserObserver(); } + /** + * Tests the notification + */ public function testNotify() { $this->expectOutputString('DesignPatterns\Observer\User has been updated'); @@ -27,6 +30,9 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $subject->property = 123; } + /** + * Tests the subscribing + */ public function testAttachDetach() { $subject = new User(); @@ -37,6 +43,9 @@ class ObserverTest extends \PHPUnit_Framework_TestCase $this->assertAttributeEmpty('_observers', $subject); } + /** + * Tests the update() invocation on a mockup + */ public function testUpdateCalling() { $subject = new User();