【问题标题】:Laravel unit test validationLaravel 单元测试验证
【发布时间】:2017-05-23 20:33:31
【问题描述】:

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

$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: 异常 'Illuminate\Foundation\Validation\ValidationException' 带有消息 '给定的数据未能通过验证。'

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

【问题讨论】:

    标签: laravel validation unit-testing mocking


    【解决方案1】:

    我用的是工厂。如果你把它放在你的数据库/工厂/ModelFactory.php

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

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

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

    工厂将生成一个数据库行,因此如果存在验证,则验证将通过。

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

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2015-10-01
      • 1970-01-01
      • 2014-03-29
      • 2018-05-30
      • 2019-12-18
      • 2011-01-11
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多