php - 测试完全使用另一个对象方法的方法

标签 php unit-testing testing phpunit

我正在重构一个类,同时为它编写单元测试。 有一种情况是我的一个方法完全调用另一个对象的方法,该方法被注入(inject)到我正在测试的这个类中。

所以我必须模拟我注入(inject)到类中的对象。

现在的问题是,是否值得为这个特定方法编写单元测试? 编写单元测试似乎很奇怪,它所做的一切都是调用其他对象的方法,而该对象本身必须被模拟,那么我为什么要测试这个方法呢?

测试的目的不就是检查方法的功能是否按预期工作吗? 如果是,那么当我模拟它的所有内容并且该特定方法没有任何东西可以测试时,我为什么要测试?

我真的很困惑!

我坚持的方法是这个(用于自定义 session 处理):

public function write($sessionId, $sessionData)
{
    $sth = $this->databaseConnection->prepare("INSERT INTO `{$this->DBTableName}` (`session_id`,`session_name`,`session_data`) VALUES(:session_id, :session_name, :session_data) ON DUPLICATE KEY UPDATE `session_data`=:session_data;");
    $sth->bindValue(':session_id', $sessionId);
    $sth->bindValue(':session_name', $this->sessionName);
    $sth->bindValue(':session_data', $sessionData);

    return $sth->execute();
}

这也是这段代码的链接:http://pastebin.com/1FBeU6mb

顺便说一下,我刚开始为我的类(class)编写测试,我是这个测试领域的初学者,没有经验。

提前致谢。

最佳答案

我不太熟悉 php,但看起来您只是在构建和执行数据库查询,对吧?

除非此方法和以后的数据库之间有我看不到的其他层,否则这里真的没有什么值得模拟的。所以你是对的,在这里 mock 不会给你带来很多值(value)。从某种意义上说,测试这种方法的值(value)有限,因为您实际上只是在测试数据库层,通常我们可以假设它已经正确且稳定,因此不需要测试。

一般来说,模拟的值(value)在于,它允许您通过假设其他方法正在做什么来简化测试,并且让您不必间接测试这些其他方法。

在选择测试 write 方法时,事实证明您正在测试的是您有正确的步骤来返回正确的结果。就是这样。我不熟悉 php 模拟框架,但我知道对于其他语言的框架,您可以设置所谓的期望,它允许您指定将使用特定参数在特定对象上调用特定方法。您甚至可以经常指定它们的执行顺序。这里的要点是,您正在测试您的对象正在发送的传出消息,而不是这些消息的返回值。

由您决定这是否有值(value)与此测试需要的维护。

关于php - 测试完全使用另一个对象方法的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033847/

相关文章:

php - 如何正则表达式匹配一串数字和连字符,但不以连字符开头或结尾?

c++ - Googletest - 在本地检查失败?

c# - 读取文件的集成测试

Python 模拟错误 : stop called on unstarted patcher

database - 为复杂数据库 (EAV) 生成单元测试数据

testing - 如何在 FitNesse/Slim headless 中运行测试?

php - 实现自动提示的方法

php - Laravel - 如何访问相关对象的其他关系

php - 如何修复 "Fatal error: Call to undefined function mysqli_connect()"错误?

scala - 在 Scalatest 中实现工厂