1

I used bake to generate the controller of my users table, now I need to test using PHPUnit and CakePHP 3 if a record has been entered in the database but I can not see if this actually being inserted.

I can not apply this solution: Question

First error:

1) App\Test\TestCase\Controller\UsersControllerTest::testAdd Failed asserting that '' contains "The user has been saved.".

If I remove the assertion (or change to assertResponseSuccess)

$this->assertResponseContains('The user has been saved.');

in assertEquals the array $result is empty.

add Action in UsersController:

public function add()
{
    $user = $this->Users->newEntity();
    if ($this->request->is('post')) {
        $user = $this->Users->patchEntity($user, $this->request->data);
        if ($this->Users->save($user)) {
            $this->Flash->success(__('The user has been saved.'));
            return $this->redirect(['action' => 'index']);
        } else {
            $this->Flash->error(__('The user could not be saved. Please, try again.'));
        }
    }
    $userTypes = $this->Users->UserTypes->find('list', ['limit' => 200]);
    $this->set(compact('user', 'userTypes'));
    $this->set('_serialize', ['user']);
}

testAdd in UsersControllerTest:

public function testAdd()
{
    $this->get('/users/add');
    $this->assertResponseOk();

    //-------------------------------------------------------------------------

    $data = [
        'id' => 999999,
        'email' => '[email protected]',
        'password' => 'usuariocomum999999senha',
        'username' => 'usuariocomum999999username',
        'user_type_id' => 900000,
        'created' => '2014-07-17 18:46:47',
        'modified' => '2015-07-17 18:46:47'
    ];

    $this->post('/users/add', $data);
    $this->assertResponseContains('The user has been saved.');

    //-------------------------------------------------------------------------

    $expected = [
        [
            'id' => 999999,
            'email' => '[email protected]',
            'password' => 'usuariocomum999999senha',
            'username' => 'usuariocomum999999username',
            'user_type_id' => 900000,
            'created' => new Time('2014-07-17 18:46:47'),
            'modified' => new Time('2015-07-17 18:46:47')
        ]
    ];

    $users = TableRegistry::get('Users');
    $query = $users->find('all', [
        'fields' => ['Users.id', 'Users.email', 'Users.password',
            'Users.username', 'Users.user_type_id', 'Users.created',
            'Users.modified'],
        'conditions' => ['Users.id' => 999999]
    ]);
    $result = $query->hydrate(false)->toArray();
    $this->assertEquals($expected, $result);
}

Datasource test:

  'test' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        //'port' => 'nonstandard_port_number',
        'username' => 'shop',
        'password' => 'shop',
        'database' => 'shoppingtest',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'quoteIdentifiers' => false,
        //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
    ]

Note: CakePHP 3.0.11 and PHPUnit 4.8.6

1 Answer 1

3

You need to test that there was a redirect and a success message in the Session, The response will not contain your text as the response is just a redirect header code for the browser.

Sign up to request clarification or add additional context in comments.

1 Comment

You can make an example?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.