Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.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中单元测试的动态构造函数值_Php_Phpunit - Fatal编程技术网

php中单元测试的动态构造函数值

php中单元测试的动态构造函数值,php,phpunit,Php,Phpunit,我目前正在进行一些重构。这件事不是我干的。我只需要处理它 $expected = new instance(0,0,Argument::any()); $result = $this->otherInstance->returnsInstance([]); $this->assertEquals($expected, $result); 实例是某种模型,由其他实例返回。问题是第三个参数是动态的,是一个整数。它可以是任何东西。如您所见,它对于模型的实例化是必需的。这能被嘲笑

我目前正在进行一些重构。这件事不是我干的。我只需要处理它

$expected = new instance(0,0,Argument::any());

$result = $this->otherInstance->returnsInstance([]);

$this->assertEquals($expected, $result);
实例是某种模型,由其他实例返回。问题是第三个参数是动态的,是一个整数。它可以是任何东西。如您所见,它对于模型的实例化是必需的。这能被嘲笑吗?如何正确设置测试

这显然不起作用

::__construct() must be of the type integer, object given

那么,我该如何嘲笑这一点呢?或者,如何设置测试以处理动态值?语言等级是7.1,但我想很快升到7.4

处理不同测试场景的一种方法是使用

在下面的示例中,您可以在方法
provideModelConstructorArguments
中设置一些任意值。test
testMyTest
将运行两次,对于数据提供程序中存在的每一组值运行一次

public function provideModelConstructorArguments()
{
    return [
        [
            'argument1' => 0,
            'argument2' => 1,
            'argument3' => 100
        ],
        [
            'argument1' => 5,
            'argument2' => 3,
            'argument3' => 57
        ]
    ];
}

/**
* @dataProvider provideModelConstructorArguments
**/
public function testMyTest($argument1, $argument2, $argument3)
{
    $expected = new instance($argument1, $argument2, $argument3);

//continue your test code 
}

处理不同测试场景的一种方法是使用

在下面的示例中,您可以在方法
provideModelConstructorArguments
中设置一些任意值。test
testMyTest
将运行两次,对于数据提供程序中存在的每一组值运行一次

public function provideModelConstructorArguments()
{
    return [
        [
            'argument1' => 0,
            'argument2' => 1,
            'argument3' => 100
        ],
        [
            'argument1' => 5,
            'argument2' => 3,
            'argument3' => 57
        ]
    ];
}

/**
* @dataProvider provideModelConstructorArguments
**/
public function testMyTest($argument1, $argument2, $argument3)
{
    $expected = new instance($argument1, $argument2, $argument3);

//continue your test code 
}

可能重复的否,它不是重复的。谢谢。可能是重复的。不,它不是重复的。谢谢,没有。这是行不通的。为了参数起见,让我们指向像getmypid或memory\u get\u usage这样的方法。实例的比较将根据数据提供程序中的数据而有所不同。我会照你说的做,但这不是一个可行的办法。我不能用静态值来模拟它。那么,我如何在这方面做到这一点呢。我知道我在一家公司的早期项目中不知何故做了这件事,但我简直记不起我用Argument::any()进行适当模拟的方式。这就是我问的原因。如果我错了,请纠正我,但是,如果第3个参数是随机的,那么在测试中创建
$expected
时通过的任何内容都可能与
$this->otherInstance->returnsInstance([])返回的实例不同。如果将断言更改为:
$this->assertInstanceOf(ExpectedModel::class,$result)?是的,你当然是对的。也许我不得不避免实际尝试使用适当的值比较进行功能测试,而选择粒度较小的测试。并不是说我(完全)对它感到满意,但似乎这是不可能的。我希望有人会——也许还会有——一种模拟1..n随机参数的方法。这是我在另一个函数测试中必须处理的问题。也许我只能进行某种类型的测量,并深入到实际计算方面的底部;可想而知,这是一个遗憾。我不确定重构是否能解决这个问题。我不知道你的代码在
otherInstance
中是如何实现的,但是如果
instance
是以不同于
returnsInstance()
的方法安装的,那么它是可以实现的。您可以在测试中使用任意的第三个参数和mock
otherInstance
部分实例化
$expected
,设置方法
otherInstance->methodThatCreateInstance()
以返回
$expected
。不过,这不是一个很好的测试用例,因为您将把
$expected
传递给
otherInstance
,只是为了断言
returnsInstance
是否正在返回它。我相信,
assertinstateof
就足够了。这是行不通的。为了参数起见,让我们指向像getmypid或memory\u get\u usage这样的方法。实例的比较将根据数据提供程序中的数据而有所不同。我会照你说的做,但这不是一个可行的办法。我不能用静态值来模拟它。那么,我如何在这方面做到这一点呢。我知道我在一家公司的早期项目中不知何故做了这件事,但我简直记不起我用Argument::any()进行适当模拟的方式。这就是我问的原因。如果我错了,请纠正我,但是,如果第3个参数是随机的,那么在测试中创建
$expected
时通过的任何内容都可能与
$this->otherInstance->returnsInstance([])返回的实例不同。如果将断言更改为:
$this->assertInstanceOf(ExpectedModel::class,$result)?是的,你当然是对的。也许我不得不避免实际尝试使用适当的值比较进行功能测试,而选择粒度较小的测试。并不是说我(完全)对它感到满意,但似乎这是不可能的。我希望有人会——也许还会有——一种模拟1..n随机参数的方法。这是我在另一个函数测试中必须处理的问题。也许我只能进行某种类型的测量,并深入到实际计算方面的底部;可想而知,这是一个遗憾。我不确定重构是否能解决这个问题。我不知道你的代码在
otherInstance
中是如何实现的,但是如果
instance
是以不同于
returnsInstance()
的方法安装的,那么它是可以实现的。您可以在测试中使用任意的第三个参数和mock
otherInstance
部分实例化
$expected
,设置方法
otherInstance->methodThatCreateInstance()
以返回
$expected
。不过,这不是一个很好的测试用例,因为您将把
$expected
传递给
otherInstance
,只是为了断言
returnsInstance
是否正在返回它。我相信,
assertInstanceOf
就足够了。