Cakephp 3 - 单元测试验证默认
Cakephp 3 - Unit test validationDefault
我目前正在尝试为以下模型编写单元测试:
<?php
namespace App\Model\Table;
use App\Model\Entity\User;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
/**
* Users Model
*
* @property \Cake\ORM\Association\HasMany $Comments
* @property \Cake\ORM\Association\BelongsToMany $Albums
*/
class UsersTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasMany('Comments', [
'foreignKey' => 'user_id'
]);
$this->belongsToMany('Albums', [
'foreignKey' => 'user_id',
'targetForeignKey' => 'album_id',
'joinTable' => 'users_albums'
]);
}
/**
* @Author: Mark van der Laan
* @Date: 23-02-2016
* @Description: Validating rules for the user model. Some additional, more complex validation rules are added.
* @param \Cake\Validation\Validator $validator Validator instance.
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator)
{
// id
$validator
->integer('id')
->allowEmpty('id', 'create');
// username
$validator
->requirePresence('username', 'create')
->notEmpty('username')
// Enabled, just in case that the username will be an email address
->email('username')
->add('username', [
'length' => [
'rule' => ['minLength', 7],
'message' => 'Username needs to be at least 7 characters long!',
]
]);
// password
$validator
->requirePresence('password', 'create')
->notEmpty('password')
->add('password', [
'length' => [
'rule' => ['minLength', 7],
'message' => 'Password needs to be at least 7 characters long!',
]
]);
// sign_in_count
$validator
->integer('sign_in_count')
->requirePresence('sign_in_count', 'create')
->notEmpty('sign_in_count');
// ip address
$validator
->allowEmpty('current_sign_in_ip')
->requirePresence('current_sign_in_ip', 'create')
// Currently checking for both IPv4 and IPv6 addresses
->ip('current_sign_in_ip', 'both');
// active
$validator
->boolean('active')
->requirePresence('active', 'create')
->allowEmpty('active');
return $validator;
}
/**
* Returns a rules checker object that will be used for validating
* application integrity.
*
* @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
* @return \Cake\ORM\RulesChecker
*/
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['username']));
return $rules;
}
}
我尝试使用以下代码片段测试 validationDefault 方法,这对我来说很重要:
public function testValidationDefault()
{
$data = ['username' => 'adminadmin@mixtureweb.nl',
'password' => 'testtest123',
'sign_in_count' => 0,
'current_sign_in_ip' => '127.0.0.1',
'active' => 'true'
];
$this->assertTrue($this->Users->save($data));
// $this->assertTrue($data);
}
当我尝试这样做时,这将抛出一个错误,提示我不应将数组传递给 assertTrue 方法。因此,我试图找到例子,但我找不到任何东西。有没有人可以找到如何对验证规则进行单元测试的参考资料? (到目前为止,我在文档中找不到任何内容)
更新
public function testValidationDefault()
{
$data = ['username' => 'adminadmin@mixtureweb.nl',
'password' => 'testtest123',
'sign_in_count' => 0,
'current_sign_in_ip' => '127.0.0.1',
'active' => true
];
$user = $this->Users->newEntity($data);
$saved = $this->Users->save($user);
$this->assertTrue($saved);
// $this->assertTrue($data);
}
这将得到 'Failed asserting that App\Model\Entity\User Object &0000000011b3c53b0000000040aca14b is true'。有谁知道我做错了什么?
看看Table::save()
return是什么,是\Cake\Datasource\EntityInterface|bool
。成功时它 return 是持久实体,失败时它 return 是布尔值 false
。所以你的保存操作成功,它将 return 一个实体,因此错误。
如果您想测试验证,您应该使用 table class 提供的验证器对象(Table::validationDefault()
通过 Table::validator()
),或者使用 Table::patchEntity()
或 Table::newEntity()
并测试 Entity:errors()
.
的值
Patching/creating实体是模型层验证发生的地方,保存过程将只应用应用程序规则。
public function testValidationDefault()
{
$data = [
'username' => 'adminadmin@mixtureweb.nl',
'password' => 'testtest123',
'sign_in_count' => 0,
'current_sign_in_ip' => '127.0.0.1',
'active' => true
];
$user = $this->Users->newEntity($data);
$this->assertEmpty($user->errors()); // empty = no validation errors
}
另见
我目前正在尝试为以下模型编写单元测试:
<?php
namespace App\Model\Table;
use App\Model\Entity\User;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
/**
* Users Model
*
* @property \Cake\ORM\Association\HasMany $Comments
* @property \Cake\ORM\Association\BelongsToMany $Albums
*/
class UsersTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasMany('Comments', [
'foreignKey' => 'user_id'
]);
$this->belongsToMany('Albums', [
'foreignKey' => 'user_id',
'targetForeignKey' => 'album_id',
'joinTable' => 'users_albums'
]);
}
/**
* @Author: Mark van der Laan
* @Date: 23-02-2016
* @Description: Validating rules for the user model. Some additional, more complex validation rules are added.
* @param \Cake\Validation\Validator $validator Validator instance.
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator)
{
// id
$validator
->integer('id')
->allowEmpty('id', 'create');
// username
$validator
->requirePresence('username', 'create')
->notEmpty('username')
// Enabled, just in case that the username will be an email address
->email('username')
->add('username', [
'length' => [
'rule' => ['minLength', 7],
'message' => 'Username needs to be at least 7 characters long!',
]
]);
// password
$validator
->requirePresence('password', 'create')
->notEmpty('password')
->add('password', [
'length' => [
'rule' => ['minLength', 7],
'message' => 'Password needs to be at least 7 characters long!',
]
]);
// sign_in_count
$validator
->integer('sign_in_count')
->requirePresence('sign_in_count', 'create')
->notEmpty('sign_in_count');
// ip address
$validator
->allowEmpty('current_sign_in_ip')
->requirePresence('current_sign_in_ip', 'create')
// Currently checking for both IPv4 and IPv6 addresses
->ip('current_sign_in_ip', 'both');
// active
$validator
->boolean('active')
->requirePresence('active', 'create')
->allowEmpty('active');
return $validator;
}
/**
* Returns a rules checker object that will be used for validating
* application integrity.
*
* @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
* @return \Cake\ORM\RulesChecker
*/
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['username']));
return $rules;
}
}
我尝试使用以下代码片段测试 validationDefault 方法,这对我来说很重要:
public function testValidationDefault()
{
$data = ['username' => 'adminadmin@mixtureweb.nl',
'password' => 'testtest123',
'sign_in_count' => 0,
'current_sign_in_ip' => '127.0.0.1',
'active' => 'true'
];
$this->assertTrue($this->Users->save($data));
// $this->assertTrue($data);
}
当我尝试这样做时,这将抛出一个错误,提示我不应将数组传递给 assertTrue 方法。因此,我试图找到例子,但我找不到任何东西。有没有人可以找到如何对验证规则进行单元测试的参考资料? (到目前为止,我在文档中找不到任何内容)
更新
public function testValidationDefault()
{
$data = ['username' => 'adminadmin@mixtureweb.nl',
'password' => 'testtest123',
'sign_in_count' => 0,
'current_sign_in_ip' => '127.0.0.1',
'active' => true
];
$user = $this->Users->newEntity($data);
$saved = $this->Users->save($user);
$this->assertTrue($saved);
// $this->assertTrue($data);
}
这将得到 'Failed asserting that App\Model\Entity\User Object &0000000011b3c53b0000000040aca14b is true'。有谁知道我做错了什么?
看看Table::save()
return是什么,是\Cake\Datasource\EntityInterface|bool
。成功时它 return 是持久实体,失败时它 return 是布尔值 false
。所以你的保存操作成功,它将 return 一个实体,因此错误。
如果您想测试验证,您应该使用 table class 提供的验证器对象(Table::validationDefault()
通过 Table::validator()
),或者使用 Table::patchEntity()
或 Table::newEntity()
并测试 Entity:errors()
.
Patching/creating实体是模型层验证发生的地方,保存过程将只应用应用程序规则。
public function testValidationDefault()
{
$data = [
'username' => 'adminadmin@mixtureweb.nl',
'password' => 'testtest123',
'sign_in_count' => 0,
'current_sign_in_ip' => '127.0.0.1',
'active' => true
];
$user = $this->Users->newEntity($data);
$this->assertEmpty($user->errors()); // empty = no validation errors
}
另见