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