php - 为什么仅在 PHPUnit 测试中禁止返回请求?
问题描述
我在 Laravel 6 项目中的测试类有问题。以下测试失败,因为返回的响应403 forbidden
不是视图。但是,我只能在测试中重现这一点 - 在主应用程序中它按预期返回视图。有没有人经历过类似的事情或可以在下面看到任何明显错误的事情?
产品测试.php
public function testUsersCanViewTheirOwnProducts(){
$user = Factory(User::class)->create();
$product = Factory(Product::class)->create(['user_id'=>$user->id]);
$this->actingAs($user);
$response = $this->get(route('show_product',['product'=>$product->id]));
$response->assertViewIs('products.show'); //Fails not a view (403 forbidden when response dumped)
$response->assertViewHas('product',$product);
}
如预期的那样倾销$user->id
和$product->id
退货1
。
产品控制器.php
public function __construct()
{
$this->authorizeResource(Product::class, 'product');
}
//...
public function show(Product $product)
{
return view("products.show",['product'=>$product]);
}
ProductPolicy.php
public function view(User $user, Product $product)
{
return $user->id === $product->user_id;
}
测试.env
//identical to .env apart from
TELESCOPE_ENABLED=false
DB_DATABASE=subscribe_test
路线/web.php
Route::get('/manage/products/{product}','ProductController@show')->middleware('auth')->name('show_product');
我已经清除了所有缓存,但没有任何效果。该资源在 PHPUnit 测试中返回 403,在应用程序中返回 200。缺少什么?
解决方案
通过编辑我的phpunit.xml
文件,我在测试中实现了预期的响应,结果证明该文件覆盖了我的.env.testing
.
删除这两行给出了预期的行为。
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
允许我期望.env.testing
给予:
DB_CONNECTION=mysql
DB_DATABASE=subscribe_test
但是我不明白为什么这会在 SQLLite 上失败?特别是当用于比较 ID 的值都转储预期值时。
推荐阅读
- python - 解决 systemExit 错误时无法理解 sys.argv
- c# - 无法生成正确的链接
- javascript - 在javascript中添加浮动数字
- python - Python 找不到随 Conda 一起安装的软件包
- java - 通信链接失败原因:java.net.SocketException:连接重置。
- mongodb - Mongo + Docker 不允许副本集的覆盖驱动程序
- c++ - C++ 指针和内存释放
- angular - 用管道控制 Observables
- eclipse - 我无法从 eclipse 市场安装 Tomcat 插件
- curl - listStatus 上的 INVALID_REQUEST_PARAMETER