Php 如何对循环对象的函数进行单元测试?

Php 如何对循环对象的函数进行单元测试?,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,让我解释一下 function insertObjects($objs) { foreach ($objs as $obj) { $this->repository->insert($obj); } } 我不想测试数据库中的插入是否有效,因为我假设它有效(它是一个不同的单元)。我也不想测试foreach,因为很明显foreach会起作用。所以这里唯一要测试的是$objs是一个格式良好的数组。但是如果$objs是我将要传递的模拟数据。。。那么这是否意味

让我解释一下

function insertObjects($objs) {
    foreach ($objs as $obj) {
        $this->repository->insert($obj);
    }
}

我不想测试数据库中的插入是否有效,因为我假设它有效(它是一个不同的单元)。我也不想测试foreach,因为很明显foreach会起作用。所以这里唯一要测试的是$objs是一个格式良好的数组。但是如果$objs是我将要传递的模拟数据。。。那么这是否意味着这个函数没有需要测试的内容

如果存在无效输入的可能性(格式不正确的数组、空值等),则需要在方法中通过显式检查来处理这种情况

在测试中,您将尝试使用各种无效值调用您的方法,并检查您的方法是否正确响应,即未调用数据库插入方法、引发异常、记录错误等


除此之外,唯一要测试的是是否使用与传入的有效测试数组中的值相对应的参数调用数据库插入方法。

我猜存储库是
insertObjects
方法的外部依赖项,因此可以测试是否调用了
repository::insert()
方法n(数组大小)次。我喜欢这个想法,但在实践中感觉非常冗余。如果我有一个包含n个项的数组,并且我在foreach循环中遍历它们,那么它当然会被调用n次。假设构造(foreach)是一个已经过单元测试的独立单元。您需要模拟
$this->repository
。您应该先阅读相关内容。如果您还有其他问题,我可以help@hek2mgl我知道mocking,但我一直认为它应该用于第三方服务。
$this->repository
在这种情况下,是我自己的数据层基本。但我认为模拟仍然可以用于测试其调用。在这种情况下,模拟是非常好的。无论是否是第三方代码,不属于被测系统的所有内容都应该/可能会被模拟。你是对的,我可以在函数中检查输入数组。至于测试我的数据使用正确的参数调用基本插入方法…如何在此单元测试中进行测试?它可能会在存储库插入的单元测试中进行测试。您需要模拟存储库对象,并根据情况(有效或无效输入)检查是否使用预期值调用模拟。所有详细信息都在中。请从标题为“模拟对象”的部分开始阅读。