幼虫单元测试验证

时间:2017-01-09 14:40:53

标签: laravel validation unit-testing mocking

我正在尝试使用以下验证规则对我的方法进行单元测试

$rules = [
        'image_id' => 'required|exists:images,id'
    ];

我的考试

    $formData = [
        'title' => 'test regulatory update',
        'body' => 'test body',
        'image_id' => 1000,
        'file_id' => 3000,
        'enforce_date' => '2018-01-01',
        'region_id' => 4000
    ];


    $trans = $this->getRealTranslator();
    $v = new Validator($trans, array('image_id' => 1000), array('image_id' => 'exists:images,id'));
    $validatorMock = Mockery::mock('Illuminate\Validation\PresenceVerifierInterface');
    $validatorMock->shouldReceive('setConnection')->once()->with(null);
    $validatorMock->shouldReceive('getCount')
        ->once()
        ->with('images', 'id', 1000, null, null, [])
        ->andReturn(true);
    $v->setPresenceVerifier($validatorMock);


    $response = $this->call('POST', '/regulatory', $formData);

    $statusCode = $response->getStatusCode();
    $this->assertEquals(200, $statusCode);
    $this->assertTrue($v->passes());

运行测试时出现以下错误

testing.ERROR: exception 'Illuminate\Foundation\Validation\ValidationException' with message 'The given data failed to pass validation.'

我的问题是如何模拟验证以查看1000的图像ID存在?

1 个答案:

答案 0 :(得分:0)

我用的是工厂。如果将其放在数据库/ factories / ModelFactory.php

$factory->define(App\Image::class, function (Faker\Generator $faker) {
    return [
        'id' => $faker->number,
    ];
});

然后,您可以将image_id数组中的form_data更改为:

'image_id' => factory(App\Image::class)->create([
    'id' => 1000
]),

工厂将生成数据库行,因此验证是否存在,将通过。

您在工厂发送的create方法包含的'id' => 1000数组会覆盖工厂生成的数据。这意味着工厂生成ID为1000的图像行。