【问题标题】:Laravel test response with The given data was invalidLaravel 测试响应给定的数据无效
【发布时间】:2019-09-19 12:04:23
【问题描述】:

我正在用 laravel 进行单元测试,所以我调用了控制器函数,我得到了一个数组的响应
我一直在回应这个

return back()->with('success', 'Lots was generated')  

return $this->lots_available;  

测试给了我这样的回应:

有 1 个错误:

  1. 测试\功能\LotTest::test_lots Illuminate\Validation\ValidationException:给定的数据无效。

我不明白这个回复的原因,我从测试开始

这是我的功能测试

public function test_lots()  
{    
    $this->withoutExceptionHandling();  

    $product = factory(Product::class)->create([
        'size' => 20
    ]);

    $lots = factory(Lot::class, 10)->create([
        'product_id' => $product->id,
    ]);

    $admin = factory(User::class)->create([
        'role_id' => 3
    ]);

    $client_request = 500;

    $this->actingAs($admin)
    ->post(route('lots.distribution'), [$product, $client_request])
    ->assertStatus(200);
}  

这是我调用的方法

public function distribute(ProductRequest $product, $client_order)
{
    $this->lots = $product->lots;  
    $this->client_order = $client_order;  
    $this->getLotAvailable();

    return $this->lots_available;  
}

【问题讨论】:

  • 你能告诉我们ProductRequest里面的验证吗?
  • 顺便说一下Console.log($client_order); 这是javascript。验证成功后会报错。
  • @cbaconnier 这是验证类 ProductRequest 扩展 FormRequest { public function rules() { return [ 'title' => 'required|unique:products|max:255', 'sap_id' => '必需|独特:产品|最大:255']; } }

标签: php laravel unit-testing automated-tests


【解决方案1】:

将响应放入变量中并使用dd() 进行打印。

您将在 messages 方法中找到它。 为我工作。

dd($response);

【讨论】:

    【解决方案2】:

    假设您的路线类似于Route::post('/distribute/{product}/{client_order}')

    route('lots.distribution')需要函数调用里面的参数

    route('lots.distribution', [$product, $client_request])
    

    那么你需要在ProductRequest 中发送通过你的规则的数据否则你会得到一个验证错误。如果您在发布后尝试dd(session('errors')),您可能会看到有关缺少字段的错误。

    ->post(
        route('lots.distribution', [$product, $client_request]), 
        ['title => 'unique_title', 'sap_id' => 'unique_id']
    )
    

    最后在你的方法中,我假设请求 ProductRequest 与 Model Product 不同:

    public function distribute(ProductRequest $request, Product $product, $client_order)

    【讨论】:

    • 这是路线Route::post('/lot-distribution', 'Front\LotController@distribute')->name('lots.distribution');
    猜你喜欢
    • 2016-09-06
    • 2017-09-23
    • 2019-04-06
    • 1970-01-01
    • 2014-02-01
    • 2020-04-16
    • 2020-07-01
    • 2021-07-27
    • 2019-05-21
    相关资源
    最近更新 更多