如何使用post请求对Laravel测试执行Assert?

vbopmzt1  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(139)

我仍然是laravel框架测试的初学者。因此,我在我的api的端点上进行了测试,但是对于post请求,我在方法assertOk(),assertStatus()和其他方法上遇到了问题,它返回了一个错误,但是当我离开测试而没有Assert时,它返回了一个警告。下面是我的测试代码

<?php

namespace Tests\Feature;

use Illuminate\Http\Response;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Request;
use Symfony\Component\HttpFoundation\Response as HttpResponse;
use Tests\TestCase;

class LocationTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_get_all_report()
    {
        Http::fake([
            'http://127.0.0.1:8000/*' => Http::response([
                [
                    "latitude"=> "1.56786467",
                    "longitude"=> "-0.056789685",
                    "message"=> "test test that's a place of risk"  
                ],
                [
                    "latitude"=> "1.56786467",
                    "longitude"=> "-0.056789685",
                    "message"=> "test test that's a place of risk"  
                ]                
            ], 200),
        ]);

        $response = $this->getJson('api/get-all-signal-zone')->assertStatus(200);
    }

    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_get_all_report_catch_error()
    {
        Http::fake([
            'http://127.0.0.1:8000/*' => Http::response([
                [
                    "message"=> "Server error"  
                ]
            ], 500),
        ]);

        $response = $this->getJson('api/get-all-signal-zone')->assertStatus(Response::HTTP_INTERNAL_SERVER_ERROR);
    }
    
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_get_all_report_by_date()
    {
        Http::fake();

        $response = Http::post('http://127.0.0.1:8000/api/get-all-signal-zone-by-date', [
            "date"=> "2022-11-10"
        ]);

    }
}

我路由文件

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LocationController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Route::get('/get-all-signal-zone', [LocationController::class, 'all']);
// Route::get('/get-all-signal-zone-by-date/{date}', [LocationController::class, 'getLocationByDate'])->name('reporting_by_date');
Route::post('/get-all-signal-zone-by-date', [LocationController::class, 'getLocationByDate']);
Route::post('/send-signal-zone', [LocationController::class, 'save']);

这是我的控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Repositories\Location\LocationRepository;

/**
 * Description of LocationController
 *
 * @author Amoungui
 */
class LocationController extends Controller
{
    public function __construct(LocationRepository $locationRepository) {
        $this->locationRepository = $locationRepository;
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function all(){
        return $this->locationRepository->list(); 
    }

    /**
     * View a list of the resource based on a date.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function getLocationByDate(Request $request){
        return $this->locationRepository->getByDate($request->date);
    }

    /**
     * Save a newly created resource in external api.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */    
    public function save(Request $request){
        $response = $this->locationRepository->store($request->all());
        if($response->successful()){
            return response()->json([
                'status' => true,
                'message' => "location submited successfully",
                'data' =>  $request->all()
            ], 201);
        }
        
        return response()->json([
            'data' => null,
            'message' => 'Failed',
        ], 500);
    }
}

我有此错误
WARN Tests\Feature\LocationTest get all report get all report catch error!按日期获取所有报告→此测试未执行任何AssertC:\wamp64\www\backend-11-user-story-reporting-of-a-place-in-danger\tests\Feature\LocationTest.php:61
测试:1项有风险,4项通过时间:0.64s

pprl5pva

pprl5pva1#

在 Laravel 中 , 有 一 个 工具 集 可以 模拟 任何 你 需要 模拟 的 东西 , 就 像 你 看到 的 here 一样 。 我 想 你 误解 了 HTTP::fake() 的 功能 。 这个 函数 在 你 的 代码 中 模拟 传出 的 HTTP 请求 , 而 不是 返回 一 个 答案 , 而 不 执行 请求 。
如果 你 在 模仿 你 自己 的 端点 ( 例如 127.0.0.1:8000/* ) , 你 实际 上 是 在 阻止 Laravel 向 它 的 端点 发送 请求 并 处理 它 , 就 像 你 在 返回 一 个 假 的 答案 而 没有 触发 你 的 控制 器 一样 。
HTTP::fake() ( 警告 , 意见 先行 ) 的 要点 是 模拟 对外 部 端点 的 调用 , 例如 , 如果 您 的 LocationRepositoryhttp://not-a-real-location-api.com 发送 一 个 请求 , 您 可能 希望 模拟 该 请求 并 假定 其 响应 , 因为 您 不 希望 您 的 测试 触发 实际 的 API 。
考虑 完全 删除 Http::fake() 的 使用 , 因为 在 您 的 情况 下 , 它 会 破坏 测试 的 目的 , 但 为了 使 这个 答案 完整 , 请 注意 , 当 不 带 参数 调用 Http::fake() 时 , 它 会 返回 默认 的 空 HTTP 200 响应 。

相关问题