Я новичок в модульном тестировании и пытаюсь протестировать метод контроллера в Laravel 5.1 и Mockery.
Я пытаюсь протестировать метод registerEmail
, который я написал ниже:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Response;
use Mailchimp;
use Validator;
/**
* Class ApiController
* @package App\Http\Controllers
*/
class ApiController extends Controller
{
protected $mailchimpListId = null;
protected $mailchimp = null;
public function __construct(Mailchimp $mailchimp)
{
$this->mailchimp = $mailchimp;
$this->mailchimpListId = env('MAILCHIMP_LIST_ID');
}
/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function registerEmail(Request $request)
{
$this->validate($request, [
'email' => 'required|email',
]);
$email = $request->get('email');
try {
$subscribed = $this->mailchimp->lists->subscribe($this->mailchimpListId, [ 'email' => $email ]);
//var_dump($subscribed);
} catch (\Mailchimp_List_AlreadySubscribed $e) {
return Response::json([ 'mailchimpListAlreadySubscribed' => $e->getMessage() ], 422);
} catch (\Mailchimp_Error $e) {
return Response::json([ 'mailchimpError' => $e->getMessage() ], 422);
}
return Response::json([ 'success' => true ]);
}
}
Я пытаюсь смоделировать объект Mailchimp, чтобы он работал в этой ситуации. Пока мой тест выглядит следующим образом:
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class HomeRouteTest extends TestCase
{
use WithoutMiddleware;
public function testMailchimpReturnsDuplicate() {
$listMock = Mockery::mock('Mailchimp_Lists')
->shouldReceive('subscribe')
->once()
->andThrow(\Mailchimp_List_AlreadySubscribed::class);
$mailchimp = Mockery::mock('Mailchimp')->lists = $listMock;
$this->post('/api/register-email', ['email'=>'[email protected]'])->assertJson(
'{"mailchimpListAlreadySubscribed": "[email protected] is already subscribed to the list."}'
);
}
}
У меня phpUnit возвращает неудачный тест.
HomeRouteTest::testMailchimpReturnsDuplicate Mockery\Exception\InvalidCountException: метод subscribe() из Mockery_0_Mailchimp_Lists должен вызываться ровно 1 раз, но вызываться 0 раз.
Кроме того, если я утверждаю, что код состояния равен 422, phpUnit сообщает, что он получает код состояния 200.
Он отлично работает, когда я тестирую его вручную, но мне кажется, что я упускаю из виду что-то довольно простое.
Mailchimp
классу? Не псевдоним, а полный путь с пространством имен. - person Armen Markossyan   schedule 01.08.2015