php 单元测试 静态类,单元测试和静态方法

小编典典

静态方法本身并不比实例方法难测试。当一个方法(静态方法或其他方法)调用 其他

静态方法时会出现问题,因为您无法隔离正在测试的方法。这是一个很难测试的典型示例方法:

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('', 5)

->will($this->returnValue(null));

$dao = new UserDao($log, $database);

self::assertNull($dao->findUser(5));

}

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

2020-05-29

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值