Laravel 5 模拟Laravel自定义验证规则类不工作

Laravel 5 模拟Laravel自定义验证规则类不工作,laravel-5,phpunit,Laravel 5,Phpunit,我正在表单提交中实现一个新的自定义验证规则。但是我想在单元测试中绕过验证规则。下面是验证规则和单元测试类的简化。我错过了什么 namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class Captcha implements Rule { public function passes($attribute, $value) { // assuming will always retur

我正在表单提交中实现一个新的自定义验证规则。但是我想在单元测试中绕过验证规则。下面是验证规则和单元测试类的简化。我错过了什么

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Captcha implements Rule
{
    public function passes($attribute, $value)
    {
        // assuming will always return false in testing
        // works fine when true
        return false; 
    }

    public function message()
    {
        return 'Captcha error! Try again later or contact site admin.';
    }
}
编辑:包括
FormRequest
Controller
文件

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\Captcha;

class NewUserRequest extends FormRequest {

    public function rules()
    {
        return [
            'name' => ['required', new Captcha]
        ];
    }
}
编辑II:看起来像是拉雷维尔本身的一只虫子


尝试了提供的解决方案,但仍然不起作用

似乎在Laravel中存在了很长一段时间,因此解决方法是不使用Mock。所以当
测试
环境存在时,我将跳过
规则

if (app()->environment() === 'testing')
    return true;

很长一段时间以来,这似乎是Laravel中存在的一个bug,因此解决方法是不使用Mock。所以当
测试
环境存在时,我将跳过
规则

if (app()->environment() === 'testing')
    return true;

必须通过Laravels服务容器实例化该类,以便对其进行模拟。实现这一点的最佳方法(在这种情况下)是简单地将
new Captcha
更改为
app(Captcha::class)

名称空间App\Http\Requests

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\Captcha;

class NewUserRequest extends FormRequest {

    public function rules()
    {
        return [
            'name' => ['required', app(Captcha::class)]
        ];
    }
}

我建议不要告诉规则本身根据环境改变其行为,因为当您试图弄清楚为什么captcha在开发环境中没有做任何事情,但在生产中失败时,这可能会导致一点混乱。

必须通过中的Laravels服务容器实例化该类命令它被嘲笑。实现这一点的最佳方法(在这种情况下)是简单地将
new Captcha
更改为
app(Captcha::class)

名称空间App\Http\Requests

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\Captcha;

class NewUserRequest extends FormRequest {

    public function rules()
    {
        return [
            'name' => ['required', app(Captcha::class)]
        ];
    }
}

我建议不要告诉规则本身根据环境更改其行为,因为当您试图弄清楚为什么captcha在开发环境中没有做任何事情,但在生产中失败时,这可能会导致一点混乱。

您的代码将模拟实例注册到容器中(隐式地通过
->mock()
)。您也从容器中检索它吗?
app(Captcha::class)
在您的代码中?如果您不这样做,只需执行
new Captcha
,那么它将不起作用。位于的文档给出了这个示例,这样,它就不可模拟。您的代码将模拟实例注册到容器中(隐式地由
->mock()
)。您也从容器中检索它吗?
app(Captcha::class)
在你的代码中?如果你不这样做,但只做
新验证码,那么它就不起作用了。网站上的文档给出了这个例子,这样的话,它是不可模仿的。哥们,它确实起作用了,虽然它看起来仍然像一个解决方案,但仍然比我的解决方案好。它看起来像一个解决方案,但看起来非常聪明,而且它完成了工作唯一的问题是,只有在规则不需要任何参数的情况下,您才能执行此操作。+1实际上,它是有效的,尽管它看起来仍然像一个解决方案,但仍优于我的解决方案。它看起来确实像一个解决方案,但看起来非常聪明,并且完成了任务。唯一的问题是,您只能在不需要任何参数的情况下执行此操作d服从你的规则。+1