【发布时间】:2015-10-21 13:19:32
【问题描述】:
我是单元测试新手,并尝试在 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'=>'duplicate@email.com'])->assertJson(
'{"mailchimpListAlreadySubscribed": "duplicate@email.com is already subscribed to the list."}'
);
}
}
我有 phpUnit 返回一个失败的测试。
HomeRouteTest::testMailchimpReturnsDuplicate Mockery\Exception\InvalidCountException:来自 Mockery_0_Mailchimp_Lists 的方法 subscribe() 应该被准确调用 1 次,但被调用 0 次。
另外,如果我断言状态码是 422,phpUnit 会报告它正在接收状态码 200。
当我手动测试它时它工作正常,但我想我忽略了一些相当容易的东西。
【问题讨论】:
-
嗨。您到
Mailchimp课程的完整路径是什么?不是别名,而是带有命名空间的完整路径。 -
我在这里使用 skovmand/mailchimp-laravel 包:github.com/skovmand/mailchimp-laravel。 Mailchimp 类位于全局命名空间中,文件中还有 require_once 的许多其他类。
-
你在嘲笑 Mailchimp_Lists,但我没有看到你的控制器中的任何地方都加载了该类。
-
它不包含在控制器中,Mailchimp类文件需要_onces Mailchimp_Lists在里面。我认为通过模拟 Mailchimp 并将其上的列表参数设置为模拟,应该可以解决问题吗?显然还是有问题。
-
也许是对这个问题的扩展:你将如何测试这个?
标签: php unit-testing mockery laravel-5.1