我的问题是关于单元测试.假设我们有以下课程;
class X
{
public function p1(){
//logic
$a = $this->p2();
//more logic
}
public function p2(){
//even more logic
}
}
我在想的是,为p1方法编写的测试应该只执行并测试p1方法而不是p2.但是为了意识到我应该得到一个类X的模拟并在该模拟实例上调用p1方法,如下所示.
$xMock = $this->getMockBuilder('\X')
->setMethods(array('p2'))
->getMock();
$xMock->expects($this->any())
->method('p2')
->will($this->returnValue($value));
$resultTobeAsserted = $xMock->p1();
不幸的是,这样做对我来说有点不对劲.我与同事讨论了这个话题,归结为你如何定义你的SUT(被测系统).
如果测试人员将正在测试的特定方法视为SUT,那么从SUT调用的其他方法似乎是依赖关系,并且测试人员自然会想要模拟它们.另一方面,如果测试者将整个类视为SUT,那么这些方法调用将成为测试的一部分,因此没有任何理由来模拟它们.
这个结论是否正确?哪种思维会产生更强大的单元测试?
解决方法:
When writing a unit test for p1 method, should I mock p2 method?
没有.
通过模拟p2,您可以对类的实现细节进行例外处理.
Unfortunately doing that feels a little wrongish to me.
我说它落在了它身上.
Which kind of thinking would yield more robust unit tests?
如果测试类的可观察行为,则确保在更改类的实现时类仍然执行它应该执行的操作.多数民众赞成.
如果您测试一个方法并模拟该方法的部分实现(内部方法调用),那么您测试一个特定的实现,如果测试失败,您不知道外部行为是否发生了变化.
我已经在以下方面更详细地写了这篇文章:
其中详细说明了为什么我认为测试行为而不是方法很重要的原因.
简而言之
Unit testing, in PHP, is about testing the observable behaviors of a class!
行为:
>返回值
>调用其他方法
>修改全局状态(写入文件,db,$GLOBALS)
测试那些东西.无视实施细节.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。