2014-10-03 57 views
2

让我解释一下自己。如何对单元测试循环对象的函数?

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

我不想测试插入数据库的工作,因为我认为它工作(这是一个不同的单位)。我也不想测试foreach,因为显然foreach会起作用。所以这里唯一要测试的是$ objs是一个格式良好的数组。但是如果$ objs是我将要传入的模拟数据......那么这是否意味着没有什么可以测试这个函数呢?

+1

我猜存储库是'insertObjects'的外部依赖项方法,因此您可以测试'Repository :: insert()'方法是否被称为_n_(数组大小)次。 – Crozin 2014-10-03 06:25:40

+0

我喜欢这个想法,但在实践中感觉非常多余。如果我有一个n项的数组,并且我在foreach循环中遍历它们,那么它当然会被调用n次。假设构造(foreach)是一个已经进行过单元测试的独立单元。 – allenylzhou 2014-10-03 06:29:25

+1

你需要模拟'$ this-> repository'。首先你应该阅读[嘲笑](https://phpunit.de/manual/current/en/test-doubles.html)。如果您还有其他问题,我可以帮助 – hek2mgl 2014-10-03 06:30:22

回答

1

如果有任何输入无效的机会(一个格式不正确的数组,空值等),您需要通过明确地检查它来处理您的方法中的情况。

在您的测试,你会再尝试打电话给你的方法有各种无效的值,并检查你的方法是否正确响应,即数据库插入方法不叫,引发异常,记录错误等

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

+0

你说得对,我可以检查输入数组的功能。至于测试我的数据库插入方法是否用正确的参数调用...我将如何测试这个单元测试?它可能会在存储库插入的单元测试中进行测试。 – allenylzhou 2014-10-03 06:32:08

+0

您需要模拟您的资源库对象,并根据大小写(有效或无效输入)检查模拟是否使用期望值调用,或根本不调用。 – 2014-10-03 06:32:53

+1

所有的细节都在[本页](https://phpunit.de/manual/current/en/test-doubles.html)。开始阅读标题为* Mock objects *的部分。 – 2014-10-03 06:46:31