栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

单元测试和静态方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单元测试和静态方法

静态方法本身并不比实例方法难测试。当一个方法(静态方法或其他方法)调用 其他
静态方法时会出现问题,因为您无法隔离正在测试的方法。这是一个很难测试的典型示例方法:

public function findUser($id) {    Assert::validIdentifier($id);    Log::debug("Looking for user $id");  // writes to a file    Database::connect();      // needs user, password, database info and a database    return Database::query(...);         // needs a user table with data}

您可能想用这种方法测试什么?

  • 传递除正整数以外的任何东西都会抛出异常
    InvalidIdentifierException
  • Database::query()
    接收正确的标识符。
  • null
    如果没有找到,则返回匹配的用户。

这些要求很简单,但是您还必须设置日志记录,连接到数据库,向数据库中加载数据等。

Database
该类应独自负责测试其可以连接和查询。该
Log
班应该记录这样做。
findUser()
应该不必处理任何此类问题,但是必须这样做,因为这取决于它们。

相反,如果上述方法在

Database
Log
实例上调用了实例方法,则该测试可以传入具有特定于测试的脚本化返回值的模拟对象。

function testFindUserReturnsNullWhenNotFound() {    $log = $this->getMock('Log');  // ignore all logging calls    $database = $this->getMock('Database', array('connect', 'query');    $database->expects($this->once())->method('connect');    $database->expects($this->once())->method('query')  ->with('<query string>', 5)  ->will($this->returnValue(null));    $dao = new UserDao($log, $database);    self::assertNull($dao->findUser(5));}

如果

findUser()
忽略调用
connect()
,传递
$id
5
)的错误值或返回以外的其他值,则上述测试将失败
null
。优点是不涉及任何数据库,从而使测试快速而稳健,这意味着它不会因与测试无关的原因而失败,例如网络故障或错误的样本数据。它使您可以专注于真正重要的事情:中包含的功能
findUser()



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376618.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号