Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用mockry对具有依赖项的类进行单元测试_Php_Unit Testing_Testing_Laravel_Mockery - Fatal编程技术网

Php 使用mockry对具有依赖项的类进行单元测试

Php 使用mockry对具有依赖项的类进行单元测试,php,unit-testing,testing,laravel,mockery,Php,Unit Testing,Testing,Laravel,Mockery,我是测试新手,我正在尝试创建一个单元测试,它覆盖NewsCreator创建方法中的第一条if语句 这个问题有两部分 第一:我应该如何实例化NewsCreator来处理模拟的验证器和存储库 第二:测试这条路径的正确方法是什么 下面是调用需要测试的类的控制器方法: 公共函数存储() { $creator=新新闻创建者($this); 返回$creator->create(输入::all()); } 下面是我想测试的类NewsCreator: 方法失败()。 在单元测试中,您正在以数据create(

我是测试新手,我正在尝试创建一个单元测试,它覆盖NewsCreator创建方法中的第一条if语句

这个问题有两部分

第一:我应该如何实例化NewsCreator来处理模拟的验证器和存储库

第二:测试这条路径的正确方法是什么

下面是调用需要测试的类的控制器方法:

公共函数存储()
{
$creator=新新闻创建者($this);
返回$creator->create(输入::all());
}
下面是我想测试的类NewsCreator:

方法
失败()。
在单元测试中,您正在以数据
create([])
的形式传入一个空数组。 validatorMock上的参数期望使用参数
foo
调用
fails()
。您必须修改它以匹配空数组

$newsValidator->shouldReceive('fails')->with([])->once()->andReturn(true);
您还必须在validatorMock上指定
validator->messages()
方法,因为您的类中也会调用该方法

$newsValidator->shouldReceive('messages')->once();
要使此测试真正有意义,您必须断言
NewsCreationFails
的结果与
create()
的返回值匹配


看起来这就是我所需要的,一切似乎都进行得很顺利,只是我不认为我的听众受到了恰当的嘲笑<代码>1)WHS\Portal\Tests\News\NewsCreatorTest::test\u失败\u验证数组()与预期的类型“string”不匹配。
我可以通过将存根中的返回值更改为字符串来删除错误。这就是我应该做的吗?目前,存根方法newsCreationFailed($data)只返回$data。您可以像模拟其他模拟一样模拟您的侦听器。为什么要创建一个单独的存根类?因为任何类都可以是侦听器,所以我不知道该怎么做。我认为只需使用所需的方法newsCreationFails创建一个虚拟类。我添加了当前的测试以及存根类,我假设所有侦听器都实现了一个公共接口。如果不是,你真的应该。您可以在构造函数中键入提示接口并轻松模拟接口。顺便说一句,您可以简化模拟定义
m::mock('\WHS\Portal\News\DbNewsRepository[“create”]')
to
m::mock('\WHS\Portal\News\DbNewsRepository')。仅当要创建部分模拟(代理未定义的方法)或模拟的类不存在时,才需要最后一个参数。
$newsValidator->shouldReceive('fails')->with([])->once()->andReturn(true);
$newsValidator->shouldReceive('messages')->once();
$listener->shouldReceive('newsCreationFails')->once()->with('foo')->andReturn('foo-bar');
...
$result = $newsCreator->create([]);

$this->assertEquals('foo-bar', $result);