Laravel-Angular-Material中文文档——测试

API test helpers

这个库的目的是让你可以容易测试REST API
下面是一些提供给你的集成测试方法

test helper 用法
seeApiSuccess() 断言返回的响应使用了success响应宏(即返回了成功数据)
seeValidationError() 断言返回码为422,并且返回了错误(当你return response()->error('message', 422);时Laravel会抛出一个验证错误,这里断言的就是接收到此内容)
seeApiError($status_code) 断言具体的状态码错误,比方说401
seeJsonKey($key) 等价于->see('"'.$key.'"')
seeJsonValue($value) 等价于->see('"'.$value.'"')
seeJsonArray($entity) 等价于->see('"'.$entity.'":[') 当你想要得到一个数组时非常有用
seeJsonObject($entity) 等价于->see('"'.$entity.'":{') 当你想得到单个数据比方说一个订单的时候非常有用

避免在你的模型工厂中使用bcrypt()。因为这件减慢你的测试,只有当你需要知道user model创建的password时再使用它。(比方说:login,reset password的测试中)

下面是一些示例控制器和它们对应的集成测试方法
Routes.php

1
2
3
4
5
6
7
<?php
$api->group([], function ($api) {
$api->post('posts', 'PostsController@create');
});

PostsController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
use App\Post;
class PostsController{
public function create(Request $request)
{
$this->validate($request, [
'name' => 'required',
]);
$post = Post::create([
'name' => $request->input('name'),
]);
return response()->success(compact('post'));
}
}

CreatePostTest.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class CreatePostTest extends TestCase
{
public function testCreatingNewPostSuccessfully()
{
$post = factory(App\Post::class)->make();//we're not saving it in the database
$this->post('/api/posts', ['name' => $post->name])
->seeApiSuccess()
->seeJsonObject('post')
->seeJson(['name' => $post->name]);
$this->seeInDatabase('posts', [
'name' => $post->name,
]);
}
}

不要忘了在你的测试方法中路由头部的/api

JWT Auth Tests

当做测试驱动开发时,我们的大部分测试都会覆盖到被保护的接口。这些接口都需要认证。这个库提供了一些用来测试被保护的接口的方法,而无需再手动发送token

可用方法

以下方法与Laravel的test helper使用了同样的签名(get, post, put, delete, call)。

authUserGet() GET (验证通过情况)
authUserPost() POST(验证通过情况)
authUserPut() PUT(验证通过情况)
authUserDelete() DELETE(验证通过情况)
authUserCall() 自定义的方法、cookie、files、server等等(验证通过情况)

你可以通过使用$this->getAuthUser()来访问当前已经认证的用户,使用$this->getAuthUserToken(),他们在/tests/TestCase.php中是可用的。

示例

Routes.php

1
2
3
4
5
6
7
<?php
$api->group(['middleware' => 'api.auth'], function ($api) {
$api->post('posts', 'PostsController@create');
});

FavoritePostsTest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class FavoritePostsTest extends TestCase
{
public function testCreatingNewPost()
{
$post = factory(App\Post::class)->make();
$this->authUserPost('/api/posts', ['name' => $post->name])
->seeApiSuccess()
->seeJsonObject('post')
->seeJsonKeyValueString('name', $post->name);
}
}

多租户应用的测试方法

如果你的应用和平台上有着多种用户,你希望有下面的test helper吗?
->StudentGet()->StudentPost()->TeacherPost()->TeacherGet(),等等
如果你打开了TestCase.php,你可以看到我们可以通过调用$this->getAuthUserToken()手动登录一个用户。这是我们一个创建User的工厂。
你的方法应该是找到所有的认证用户方法和变量,并且将其重命名为对应的租户名,然后修改Set[租户名]方法来获得该类型用户的工厂。

1
$mentor = factory(App\User::class)->create(['type' => '租户名']);

其他租户同理

Angular tests

ng-describe是预置的类库,它可以使你为你的angular app编写流畅的测试代码。
ng-describe使测试components, services, inject dependenciesmock ajax calls变得非常简单,你可以浏览它为注册登录组件编写的测试方法。

Angular 生成器
components, directivesservice都自动生成了ng-describe spec 文件,你只需要实现测试用例即可。

forget_password.spec.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ngDescribe({
name: 'Test forgot-password component',
modules: 'app',
inject: '$http',
element: '<forgot-password></forgot-password>',
http: {
post: {
'/api/auth/password/email': {
data: true
}
}
},
tests: function(deps) {
it('should request email verification successfully', () => {
var component = deps.element.isolateScope().vm;
component.email = 'email@localhost.com';
component.submit();
deps.http.flush();
});
}
});
您的打赏是对我最大的鼓励!