laravel http 测试——迹忆客-ag捕鱼王app官网
简介
laravel 为生成 http 请求、测试输出提供了流式 api。举个例子,我们来看看 laravel 自带的测试示例:
get('/');
$response->assertstatus(200);
}
}
get
方法生成了一个 get 请求,而 assertstatus
方法断言返回的响应应该包含给定的 http 状态码。除了这个简单的断言之外,laravel 还包含检查响应头、响应内容、响应 json 结构等多种断言。
自定义请求头
我们可以通过 withheaders 方法在请求发送给应用之前自定义请求头。你可以添加任意自定义请求头到请求实例:
withheaders([
'x-header' => 'value',
])->json('post', '/user', ['name' => 'sally']);
$response
->assertstatus(201)
->assertjson([
'created' => true,
]);
}
}
注:运行测试时,csrf 中间件会自动被禁止。
cookies
我们可以在请求之前使用withcookie
或withcookies
方法设置cookie值。withcookie
方法接受cookie名称和值作为其两个参数,而withcookies
方法接受名称/值对的数组:
withcookie('color', 'blue')->get('/');
$response = $this->withcookies([
'color' => 'blue',
'name' => 'taylor',
])->get('/');
}
}
对响应进行调试
向应用发起测试请求后,dump
、dumpheaders
和 dumpsession
方法可用于检查和调试响应内容:
get('/');
$response->dumpheaders();
$response->dumpsession();
$response->dump();
}
}
会话/认证
laravel 提供了多个辅助函数用于在 http 测试期间处理会话(session),首先,我们可以使用 withsession
方法来设置会话数据。这对于在发起请求之前加载会话数据很有用:
withsession(['foo' => 'bar'])
->get('/');
}
}
当然,会话最常见的用途还是维护认证用户的状态。对此,辅助函数 actionas 方法提供了一个简单的方式来认证当前用户,例如,我们可以使用模型工厂来生成并认证用户:
create();
$response = $this->actingas($user)
->withsession(['foo' => 'bar'])
->get('/');
}
}
我们还可以通过传递 guard 名作为 actionas
方法的第二个参数来指定使用哪一个 guard 来认证给定用户:
$this->actingas($user, 'api');
测试 json api
laravel 还提供了多个辅助函数用于测试 json api 及其响应。例如,json
、getjson
、postjson
、putjson
、patchjson
、deletejson
和 optionjson
方法用于通过多种 http 请求方式发出请求。我们还可以轻松传递数据和请求头到这些方法。作为开始,我们编写测试来生成 post 请求到 /user 并断言返回的数据是否是我们所期望的:
postjson('/user', ['name' => 'sally']);
$response
->assertstatus(201)
->assertjson([
'created' => true,
]);
}
}
注:assertjson
方法将响应转化为数组并使用 phpunit::assertarraysubset
验证给定数组在应用返回的 json 响应中是否存在。所以,如果在 json 响应中存在其它属性,这个测试仍然会通过,只要给定的片段存在即可。
此外,json 响应数据可以通过数组变量方式在响应中访问:
$this->asserttrue($response['created']);
验证 json 匹配
如果想要验证给定数组和应用返回的 json 能够完全匹配,可以使用 assertexactjson
方法:
postjson('/user', ['name' => '学院君']);
$response
->assertstatus(201)
->assertexactjson([
'created' => true,
]);
}
}
验证 json 路径
如果想要验证 json 响应是否在指定路径上包含某些数据,可以使用 assertjsonpath
方法:
postjson('/user', ['name' => '学院君']);
$response
->assertstatus(201)
->assertjsonpath('team.owner.name', 'foo')
}
}
测试文件上传
illuminate\http\uploadedfile
类提供了一个 fake
方法用于生成假文件或图片进行测试。这一机制和 storage facade 的 fake
方法联合在一起,极大地简化了文件上传的测试。例如,可以联合这两个特性来轻松测试头像上传表单:
json('post', '/avatar', [
'avatar' => uploadedfile::fake()->image('avatar.jpg')
]);
// assert the file was stored...
storage::disk('avatars')->assertexists('avatar.jpg');
// assert a file does not exist...
storage::disk('avatars')->assertmissing('missing.jpg');
}
}
伪造文件自定义
使用 fake
方法创建文件的时候,可以指定宽度、高度、以及图片的尺寸以便更好的测试验证规则:
uploadedfile::fake()->image('avatar.jpg', $width, $height)->size(100);
除了创建图片之外,还可以使用 create
方法创建其它类型的文件:
uploadedfile::fake()->create('document.pdf', $sizeinkilobytes);
如果需要的话,可以传递 $mimetype
参数到 create
方法来显式定义该文件应应该返回的 mime 类型:
uploadedfile::fake()->create('document.pdf', $sizeinkilobytes, 'application/pdf');
有效的断言方法
响应断言
laravel 为 phpunit 测试提供了多个自定义的断言方法。这些断言可以通过测试方法 json
、get
、post
、put
和 delete
返回的响应进行访问:
- assertcookie
- assertcookieexpired
- assertcookienotexpired
- assertcookiemissing
- assertcreated
- assertdontsee
- assertdontseetext
- assertexactjson
- assertforbidden
- assertheader
- assertheadermissing
- assertjson
- assertjsoncount
- assertjsonfragment
- assertjsonmissing
- assertjsonmissingexact
- assertjsonmissingvalidationerrors
- assertjsonpath
- assertjsonstructure
- assertjsonvalidationerrors
- assertlocation
- assertnocontent
- assertnotfound
- assertok
- assertplaincookie
- assertredirect
- assertsee
- assertseeinorder
- assertseetext
- assertseetextinorder
- assertsessionhas
- assertsessionhasinput
- assertsessionhasall
- assertsessionhaserrors
- assertsessionhaserrorsin
- assertsessionhasnoerrors
- assertsessiondoesnthaveerrors
- assertsessionmissing
- assertstatus
- assertsuccessful
- assertunauthorized
- assertviewhas
- assertviewhasall
- assertviewis
- assertviewmissing
认证断言
laravel 还为 phpunit 测试提供了一些认证相关的断言:
方法 | 描述 |
---|---|
$this->assertauthenticated($guard = null); | 断言当前用户已认证 |
$this->assertguest($guard = null); | 断言当前用户未认证 |
$this->assertauthenticatedas($user, $guard = null); | 断言给定用户已认证 |
$this->assertcredentials(array $credentials, $guard = null); | 断言给定认证信息有效 |
$this->assertinvalidcredentials(array $credentials, $guard = null); | 断言给定认证信息无效 |