错误:在 null 上调用成员函数 create(),单元测试(嘲弄)

Posted

技术标签:

【中文标题】错误:在 null 上调用成员函数 create(),单元测试(嘲弄)【英文标题】:Error:Call to a member function create() on null , unit test (Mockery) 【发布时间】:2020-06-08 02:39:11 【问题描述】:

我正在尝试对具有“create()”方法的“AdminService”类进行单元测试,并且在构造函数中我需要一个依赖项,即 AdminRepository

我使用 mockery 来模拟存储库并将这个模拟传递给 AdminService _contsruct() 但是当我运行测试时出现错误:错误:Call to a member function create() on null

这是我要测试的 AdminService : 我关注了这篇文章:Unit tests – complex argument matching with Mockery::on – the right way

use App\Repositories\AdminRepository;

class AdminService 

    protected $admin_repo;

    public function _contsruct(AdminRepository $admin_repo)
        $this->$admin_repo= $admin_repo;
    

    public function create($data)
        return  $this->admin_repo->create($data); 

    



  

测试代码是:

/** @test */
   public function it_can_create_Admin()

      $data=[
         "first_name"=>"lama",
         "last_name"=>"sonmez",
         "email"=>"lamasonmez@gmail.com",
         "password"=>"secret"
      ];


      $repo_mock = Mockery::mock(AdminRepository::class);
      $repo_mock->shouldReceive('create')->once()->with($data)
          ->andReturn('anything');
      $admin_service = new AdminService($repo_mock);
      $admin = $admin_service->create($data);
      $this->assertInstanceOf(Admin::class,$admin);

      

我不知道这里出了什么问题,请帮忙。

当我 dd($repo_mock) 给我模拟时,我的意思是它不为空 但是当我 dd($admin_service) 我得到了

App\Services\AdminService^ #4106
  #admin_repo: null
  

【问题讨论】:

【参考方案1】:

哦,我知道为什么会发生这种情况,这是因为 AdminRepository 和 AdminService 中的构造函数的下划线符号,它应该在像这样 __construct 的构造键之前有两个下划线,而不是像这样 _construct

【讨论】:

以上是关于错误:在 null 上调用成员函数 create(),单元测试(嘲弄)的主要内容,如果未能解决你的问题,请参考以下文章

错误:在 cakephp 的非对象上调用成员函数 create(),即使模型的名称已经定义

致命错误:未捕获的错误:在 null 上调用成员函数 select()

Ajax 请求 500 错误 - 在 null 上调用成员函数

Laravel 护照抛出错误:“在 null 上调用成员函数 createToken()”

致命错误:未捕获错误:在null上调用成员函数select()

Joomla、Falang 集成组件...致命错误:在 null 上调用成员函数 getTable()