2015-10-16 136 views
0

我正在努力让嘲笑使用特定的Laravel 5项目。下面是我写的测试:嘲笑Laravel 5使用嘲笑的课程

<?php 

use Illuminate\Foundation\Testing\WithoutMiddleware; 
use Illuminate\Foundation\Testing\DatabaseMigrations; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 
use App\Group; 
use App\Dealer; 
use App\News; 
use App\User; 

class PushControllerTest extends ControllerTestCase 
{ 
    public function testCreatingPush() 
    { 
     // Set user 
     $this->be($this->user); 

     // Mock Pushwoosh 
     $this->mock = \Mockery::mock('PushWoosh\PushWoosh', array('createMessage' => true)); 
     $this->app->instance('PushWoosh\PushWoosh', $this->mock); 
     $this->mock->shouldReceive('createMessage')->once()->andReturn(true); 

     // Put together the data 
     $data = array(
      'msg' => 'My first push notification' 
     ); 

     // Send a POST request 
     $response = $this->call(
      'POST', 
      '/admin/api/v1/pushes', 
      $data, 
      array(), 
      array(), 
      array() 
     ); 
     $this->assertResponseStatus(200); 
    } 
} 

下面是有问题的控制器:

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use App\Http\Requests; 
use App\Http\Controllers\Controller; 
use App\User; 
use App\Dealer; 

use Config; 

class PushController extends CustomBaseController 
{ 
    /** 
    * Store a newly created resource in storage. 
    * 
    * @param Request $request 
    * @return Response 
    */ 
    public function store(Request $request) 
    { 
     // Get group for user 
     $group = $this->user->group; 

     // Send a Push notification 
     $pushwoosh = new \PushWoosh\PushWoosh(
      // @codeCoverageIgnoreStart 
      Config::get('app.pushwoosh_application'), 
      '', 
      '', 
      Config::get('app.pushwoosh_apitoken') 
      // @codeCoverageIgnoreEnd 
     ); 

     // Validate content 
     $valid = $this->validate($request, [ 
      'msg' => 'required' 
     ]); 

     // Get message and target (if any) 
     $msg = $request->input('msg'); 
     $target = $request->input('target'); 

     // Send push notification 
     if ($target) { 
      $users = User::where('dealer_id', $target)->get(); 
     } else { 
      $users = User::where('group_id', $group->id)->get(); 
     } 
     $pushesToSend = array(); 
     foreach($users as $user) { 
      // Send push notifications for this user 
      $push = array(); 
      $push['content'] = $msg; 

      // Define conditions 
      $push['conditions'] = ['UserID', 'EQ', $user->id]; 

      // Add it to the list 
      array_push($pushesToSend, $push); 
     } 

     // Send pushes 
     $response = $pushwoosh->createMessage($pushesToSend); 

     // Respond 
     if ($response) { 
      return response()->json(200); 
     } else { 
      return response()->json(400); 
     } 
    } 
} 

现在,我使用Pushwoosh从管理员控制台发送推送消息。我用来与Pushwoosh对接的库是here。我是Mockery的新手,我无法看到它嘲笑有问题的库 - 当我运行测试时,推送请求仍然存在,测试失败,因为它没有看到预期的调用。我究竟做错了什么?

回答

1

在控制器代码中,您需要从Laravel容器获取PushWoosh\PushWoosh的实例,而不是实例化自己的实例。

+0

请您详细说明一下好吗? –

+0

最终得出结论 - 必须为Pushwoosh库创建一个服务提供者,并将其注入到控制器中。之后,一切按预期工作。 –