silverstripe-framework/docs/en/02_Developer_Guides/06_Testing/How_Tos/00_Write_a_SapphireTest.md
Aaron Carlino 6888901468
NEW: Update docs to be compliant with Gatsby site (#9314)
* First cut

* Temporarily disable composer.json for netlify build

* POC

* New recursive directory query, various refinements

* Fix flexbox

* new styled components plugin

* Apply frontmatter delimiters

* Mobile styles, animation

* Search

* Redesign, clean up

* Nuke the cache, try again

* fix file casing

* Remove production env file

* ID headers

* Move app to new repo

* Add frontmatter universally

* Hide children changelogs

* Add how to title

* New callout tags

* Revert inline code block change

* Replace note callouts

* Fix icons

* Repalce images

* Fix icon

* Fix image links

* Use proper SQL icon
2019-11-18 17:58:33 +13:00

3.2 KiB

title summary
How to write a SapphireTest Learn the basics of unit testing in Silverstripe

How to write a SapphireTest

Here is an example of a test which extends SapphireTest to test the URL generation of the page. It also showcases how you can load default records into the test database.

app/tests/PageTest.php

use SilverStripe\Dev\SapphireTest;

class PageTest extends SapphireTest
{
    /** 
     * Defines the fixture file to use for this test class
     * @var string
     */
    protected static $fixture_file = 'SiteTreeTest.yml';

    /**
     * Test generation of the URLSegment values.
     *
     * Makes sure to:
     *  - Turn things into lowercase-hyphen-format
     *  - Generates from Title by default, unless URLSegment is explicitly set
     *  - Resolves duplicates by appending a number
     */
    public function testURLGeneration()
    {
        $expectedURLs = [
            'home' => 'home',
            'staff' => 'my-staff',
            'about' => 'about-us',
            'staffduplicate' => 'my-staff-2'
        ];

        foreach ($expectedURLs as $fixture => $urlSegment) {
            $obj = $this->objFromFixture('Page', $fixture);

            $this->assertEquals($urlSegment, $obj->URLSegment);
        }
    }
}

Firstly we define a static $fixture_file, this should point to a file that represents the data we want to test, represented as a YAML Fixture. When our test is run, the data from this file will be loaded into a test database and discarded at the end of the test.

[notice] The fixture_file property can be path to a file, or an array of strings pointing to many files. The path must be absolute from your website's root folder. [/notice]

The second part of our class is the testURLGeneration method. This method is our test. When the test is executed, methods prefixed with the word test will be run.

[notice] The test database is rebuilt every time one of these methods is run. [/notice]

Inside our test method is the objFromFixture method that will generate an object for us based on data from our fixture file. To identify to the object, we provide a class name and an identifier. The identifier is specified in the YAML file but not saved in the database anywhere, objFromFixture looks the DataObject up in memory rather than using the database. This means that you can use it to test the functions responsible for looking up content in the database.

The final part of our test is an assertion command, assertEquals. An assertion command allows us to test for something in our test methods (in this case we are testing if two values are equal). A test method can have more than one assertion command, and if any one of these assertions fail, so will the test method.

[info] For more information on PHPUnit's assertions see the PHPUnit manual. [/info]

API Documentation