у меня тест:
class ContacsBLOTest extends TestCase
{
public function testsearch()
{
$Ctrl= new ContactsBLO;
$data=['id'=>1,'name'=>'The Manh','phone'=>'123456566','address'=>'180 cao lo','note'=>''];
$data=[(object)$data];
$mock_data=\Mockery::mock('DB');
$mock_data->shouldReceive('all')->andReturn($data);
$mock_ctrl= new ContactsBLO;
$mock_ctrl->select=$mock_data;
$result=$mock_ctrl->search('manh');
$this->assertNotNull($result);
}
и это класс ContacsBLO:
class ContactsBLO
{
public $db,$not_allow,$Validation;
public function __construct(){
$this->db=new DB;
$this->not_allow=['"','\'','%'];
$this->Validation = new ContactValidation;
}
public function search($request=null){
$length=strlen($request);
for ($i=0;$i<$length;$i++) {
$forbidden=$this->not_allow;
if (in_array($request[$i],$forbidden)){
return (['messenger'=>'We are not allow special character in your request','old_input'=>$request]);
}
else{
return $data=$this->db->select('*',$request);
}
}
}
}
DB:: class (я определяю подключение к базе данных и определяю метод выбора:
class DB
{
public $obj = null;
public $table = 'contacts';
public function __construct(){
$dsn = "mysql:host = ".HOST."; dbname = ".DB_NAME;
$this->obj = new \PDO($dsn, DB_USER, DB_PASS);
$this->obj->query("set names 'utf8' ");
}
public function select($row=null,$query=null) {
$sql='SELECT '.$row.' FROM '.$this->table.' '.$query;
$data = $this->obj->prepare($sql);
$data->execute();
return $data->fetchAll(\PDO::FETCH_CLASS);
}
}
Но когда я запускаю xdebug и запускаю этот тест, $forbidden имеет значение null, это означает, что фиктивный метод возвращает реальные данные, а не фиктивные данные. я не знаю почему. Любой может мне помочь! Пожалуйста!






Вы никогда не вставляли свой макет в свой класс, кроме того, при использовании ключевого слова new для создания экземпляра класса его трудно имитировать. Ваш единственный шанс в таких случаях — использовать псевдоним класса.
Чтобы избежать всего этого, вы можете передать экземпляр базы данных через конструктор ContactsBLO.
class ContacsBLOTest extends TestCase
{
public function testSearch()
{
$data = ['id'=>1,'name'=>'The Manh','phone'=>'123456566','address'=>'180 cao lo','note'=>''];
$data = json_decode(json_encode($data));
$mock_contact = \Mockery::mock(DB::class);
$mock_contact->shouldReceive('select')->andReturn($data);
$Ctrl = new ContactsBLO($mockDB);
$result = $Ctrl->search('manh');
$this->assertNotNull($result);
}
}
class ContactsBLO
{
public $db;
public $not_allow;
public $Validation;
public function __construct(DB $db) {
$this->db = $db;
$this->not_allow = ['"','\'','%'];
$this->Validation = new ContactValidation;
}
public function search($request=null){
$length=strlen($request);
for ($i=0;$i<$length;$i++) {
$forbidden = $this->not_allow;
if (in_array($request[$i],$forbidden)){
return (['messenger'=>'We are not allow special character in your request','old_input'=>$request]);
}
else{
return $data = $this->db->select('*',$request);
}
}
}
}
Я проверил это с этим кодом, и он работал нормально. Пожалуйста, проверьте, импортирован ли класс БД в верхней части вашего тестового файла. Вы также должны добавить Test ко всем именам тестовых файлов и классам (см. выше).
Извините, я не могу сейчас, у меня нет компьютера, который я мог бы использовать для TeamViewer.
Я изменил его на:
$mock_data=\Mockery::mock('DB');
$mock_data->shouldReceive('select')->andReturn($data);
$mock_ctrl= new ContactsBLO;
$mock_ctrl->db=$mock_data;
$result=$mock_ctrl->search();
И это работает для меня, спасибо за всю помощь
можешь мне тимвьювер?!