98
GETTING YOUR HANDS DIRTY TESTING MAGENTO 2 Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Embed Size (px)

Citation preview

Page 1: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

GETTING YOUR HANDS DIRTY

TESTING MAGENTO 2

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 2: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

ME

Freelance Developer & Trainerhttps://github.com/vinai

https://twitter.com/vinaikopp

Dev since 1998PHP WebDev since PHP3 (1999)

Magento since 2008-01-01Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 3: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

TESTINGGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 4: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

WHO IS DOING IT?

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 5: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

WHAT TOOL?

> PHPUnit?> Behat && PHPSpec?

> Selenium?> Codeception?

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 6: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

BUZZWORD BINGO

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 7: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

BUZZWORD I:

UNIT TESTGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 8: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

$ vendor/bin/phpunit -c "dev/tests/unit/phpunit.xml.dist"

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 9: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

$ alias unit-test="$(pwd)/vendor/bin/phpunit -c $(pwd)/dev/tests/unit/phpunit.xml.dist"

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 10: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

$ unit-test

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 11: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

$ unit-test "app/code/My/Module/Test/Unit"

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 12: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

TRY ITvendor/bin/phpunit \ -c "dev/tests/unit/phpunit.xml.dist" \ vendor/magento/module-catalog/Test/Unit/Block

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 13: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

BUZZWORD II:

INTEGRATION TEST

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 14: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

WHAT IS THE DIFFERENCE?

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 15: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

REAL OBJECTS INTERACT

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 16: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

INTEGRATION TESTS NEED THERUNTIME ENVIRONMENT

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 17: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

A failing unit test tells me exactly where my code is broken.

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 18: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

A failing integration test only tells me that something is broken.

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 19: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Separate DBdev/tests/integration/etc/install-config-mysql.php.dist

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 20: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

$ vendor/bin/phpunit -c dev/tests/integration/phpunit.xmlCould not read "dev/tests/integration/phpunit.xml".

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 21: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

$ cd dev/tests/integration$ ../../../vendor/bin/phpunit

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 22: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Every run gets it's ownetc, pub and var dirs

dev/tests/integration/tmp/

sandbox-0-b79c13eb842cf3211459b11c775bfbde/

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 23: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

BUZZWORD III:

TDDGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 24: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

WHAT IS TDD?Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 25: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

THE 3 RULESGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 26: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

I. No production code without a failing unit test

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 27: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

II. Once there is a failing unit test, stop and make it pass

by writing production code

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 28: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

III. Once the test passes, stop writing production code

until you have a failing unit test again

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 29: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

TDD FOR MAGENTO 2

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 30: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

NO DIFFERENCEGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 31: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

</TDD>Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 32: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

To learn more about TDD,check out the Clean CodersVideos from Robert C. Martin

http://cleancoders.com

(or do a training)

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 33: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

INTEGRATION TESTSFOR MAGENTO 2

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 34: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

VERY SPECIFICGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 35: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

PLATFORM KNOWLEDGE

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 36: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Magento 2 Testing Framework

dev/tests/integration/framework

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 37: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Test Framework ObjectManagerMagento\TestFramework\ObjectManager::getInstance()

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 38: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Dependencies$configReader = $objectManager->create(Reader::class);

$deploymentConfig = $objectManager->create( DeploymentConfig::class, ['reader' => $configReader]);

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 39: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

BUZZWORD IV

FIXTURESGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 40: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Fix the system into a known statebefore a test is executed.

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 41: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Simple PHP Scripts

Relative to dev/tests/integration/testsuite

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 42: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

/** * @magentoDataFixture Magento/Sales/_files/order.php * @magentoDataFixture Magento/Customer/_files/customer.php */public function testSomethingWithAnOrderAndACustomer(){ // ...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 43: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

CONFIG FIXTURES

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 44: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Store Scope/** * @magentoConfigFixture current_store catalog/price/scope 1 */public function testDoesSomeoneReadThisHelpMeLetMeOut(){ // ...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 45: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Global Scope/** * @magentoConfigFixture currency/options/allow USD */public function testHowMashAndPieTastes(){ // ...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 46: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

BUZZWORD V

TEST ISOLATION

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 47: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

FRESH INSTALLFOR EACH TEST RUN

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 48: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

dev/tests/integration/phpunit.xml.dist

<phpunit> ... <php> ... <const name="TESTS_CLEANUP" value="enabled"/> ... </php> ...</phpunit>

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 49: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

TESTS_CLEANUP== disabled

SPEEDS THINGS UP

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 50: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

TESTS_CLEANUP== disabled

MANUAL CLEANUP REQUIRED

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 51: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

integration/tmp/sandbox-*

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 52: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

DATABASE ISOLATION

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 53: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

TRANSACTIONSOR

ROLLBACK SCRIPTS

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 54: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

TRANSACTIONS/** * @magentoDbIsolation enabled */ public function testWithoutSideEffects { // ...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 55: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

TRANSACTIONS/** * @magentoDataFixture Magento/Foo/_files/bar.php */ public function testTheFixtureIsAppliedWithinATransaction { // ...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 56: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

ROLLBACK SCRIPTS/** * @magentoDataFixture Magento/Customer/_files/customer.php * @magentoDbIsolation disabled */public function testTransactionalCode(){ // ...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 57: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Before Testinclude 'Magento/Customer/_files/customer.php';

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 58: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

After Testinclude 'Magento/Customer/_files/customer_rollback.php';

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 59: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

APPLICATION ISOLATION

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 60: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

REINSTANTIATEALMOST EVERYTHING

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 61: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

RESET MAGENTO AFTER TEST/** * @magentoAppIsolation enabled */public function testTestWithSingletons(){

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 62: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Controller Tests: Automatic resetclass FooBarIndexActionTest extends \Magento\TestFramework\TestCase\AbstractController{ public function testTheLayoutIsRendered() { $this->dispatch('foo/bar/index');

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 63: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

REMEMBERTHIS

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 64: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

ISOLATEYOUR TESTS

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 65: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

AND ALL WILL BE

GOODGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 66: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

[breathing pause]

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 67: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

APPLICATION AREA

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 68: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

APP AREAS

global

frontend

adminhtml

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 69: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

/** * @magentoAppArea frontend */class AddressesTest extends \PHPUnit_Framework_TestCase{

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 70: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

MORE AREAS

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 71: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

webapi_rest

webapi_soap

cron

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 72: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

\Magento\TestFramework\App\State

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 73: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

public function testPluginInWebapiRestScope(){ $class = \Magento\TestFramework\App\State::class; $appAreaState = $this->objectManager->get($class);

$appAreaState->setAreaCode('webapi_rest');

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 74: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

protected function tearDown(){ // ... $appAreaState->setAreaCode(null); }

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 75: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

ACTION[CONTROLLER]

TESTSGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 76: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

FRONTEND

\Magento\TestFramework\TestCase\AbstractController

ADMINHTML

\Magento\TestFramework\TestCase\AbstractBackendController

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 77: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

EXAMPLE!

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 78: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Event Observer for:sales_order_place_after

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 79: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

I. TESTING THE CONFIGURATION

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 80: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

public function testTheModuleRegistersASalesOrderPlaceAfterObserver(){ $class = \Magento\Framework\Event\Config::class; $eventConfig = ObjectManager::getInstance()->create($class); $observers = $eventConfig->getObservers('sales_order_place_after');

$this->assertArrayHasKey('meetup_observer', $observers);

$expectedClass = \Meetup\Observer\Observer\SalesOrderPlaceAfter::class; $this->assertSame($expectedClass, $observers['meetup_observer']['instance']);

$this->assertFalse($observers['meetup_observer']['shared']);}

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 81: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

1/2) Get the config in array format$class = \Magento\Framework\Event\Config::class;$eventConfig = ObjectManager::getInstance()->create($class);

$event = 'sales_order_place_after';$observers = $eventConfig->getObservers($event);

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 82: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

2/2) Assert config values$this->assertArrayHasKey('meetup_observer', $observers);

$this->assertSame( SalesOrderPlaceAfter::class, $observers['meetup_observer']['instance']);

$this->assertFalse($observers['meetup_observer']['shared']);

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 83: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

II. TESTING THE OBSERVER

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 84: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

O_0(NOTHING TO TEST)

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 85: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

III. INTEGRATION TEST

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 86: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

Our observer has no side effects.We have to improvise...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 87: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

/** * @magentoDataFixture Magento/Sales/_files/order.php */public function testSalesOrderPlaceAfterObserverIsCalled(){ $this->injectMockObserverWithExpectation();

$order = $this->getOrderFixture();

$this->objectManager ->create(OrderManagementInterface::class) ->place($order);}

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 88: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

public function injectMockObserverWithExpectation(){ $mockObserver = $this->getMock(SalesOrderPlaceAfter::class); $mockObserver->expects($this->once())->method('execute');

$this->registerObserverTestDouble($mockObserver);}

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 89: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

private function registerObserverTestDouble($mockObserver){ $class = \Magento\Framework\Event\Config\Data::class; $eventConfigData = $this->objectManager->get($class);

$event = 'sales_order_place_after'; $name = 'meetup_observer';

$eventConfigData->merge( [$event => [$name => ['shared' => true]]] );

// ...}

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 90: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

private function registerObserverTestDouble($mockObserver){ // ...

$this->objectManager->addSharedInstance( $mockObserver, SalesOrderPlaceAfter::class );}

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 91: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

/** * @magentoDataFixture Magento/Sales/_files/order.php */public function testSalesOrderPlaceAfterObserverIsCalled(){ // ...

$order = $this->getOrderFixture();

// ...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 92: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

private function getOrderFixture(){ $class = OrderRepositoryInterface::class; $orderRepository = $this->objectManager->create($class);

$criteria = $this->objectManager ->create(SearchCriteriaBuilder::class) ->addFilter('increment_id', '100000001') ->create();

$result = $orderRepository->getList($criteria);

return array_values($result->getItems())[0];}

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 93: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

/** * @magentoDataFixture Magento/Sales/_files/order.php */public function testSalesOrderPlaceAfterObserverIsCalled(){ $this->injectMockObserverWithExpectation();

$order = $this->getOrderFixture();

$this->objectManager ->create(OrderManagementInterface::class) ->place($order);}

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 94: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

GO FORTHAND TEST

ALL THINGS!Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 95: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

ONE MORE THING...

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 96: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

MAGE2KATASGetting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 97: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

MAGE2KATAS

> Screencast Series> Examples

> Code Katas

mage2katas.com

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp

Page 98: Getting your Hands Dirty Testing Magento 2 (at London Meetup)

THANK YOU <3

Getting your hands dirty Testing Magento 2 - Magento London Meetup, Feb. 2016 - ! - [email protected] - twitter://@VinaiKopp