Насмешка не издевается над свойствами класса

у меня тест:

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, это означает, что фиктивный метод возвращает реальные данные, а не фиктивные данные. я не знаю почему. Любой может мне помочь! Пожалуйста!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы никогда не вставляли свой макет в свой класс, кроме того, при использовании ключевого слова 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 ко всем именам тестовых файлов и классам (см. выше).

можешь мне тимвьювер?!

the manh Nguyen 14.03.2019 10:28

Извините, я не могу сейчас, у меня нет компьютера, который я мог бы использовать для TeamViewer.

Borisu 14.03.2019 15:57
Ответ принят как подходящий

Я изменил его на:

$mock_data=\Mockery::mock('DB');
$mock_data->shouldReceive('select')->andReturn($data);
$mock_ctrl= new ContactsBLO;
$mock_ctrl->db=$mock_data;
$result=$mock_ctrl->search();

И это работает для меня, спасибо за всю помощь

Другие вопросы по теме