php 单元测试 静态类,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。

这些要求很简单,但您还必须设置日志记录,连接到数据库,加载数据等。数据库类应该负责测试它可以连接和查询。 Log类应该对记录执行相同操作。 findUser()不应该处理任何这一点,但它必须,因为它取决于他们。

如果相反,上面的方法调用了数据库和日志实例上的实例方法,测试可以传递具有特定于手头测试的脚本返回值的mock对象。

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()中包含的功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值