如何在方法-phpunit中模拟新对象
我正在用phpunit测试php代码,我遇到了一个问题: 我正在测试课程:如何在方法-phpunit中模拟新对象,php,mocking,phpunit,Php,Mocking,Phpunit,我正在用phpunit测试php代码,我遇到了一个问题: 我正在测试课程: class ClassName { public function MethodName() { // something $objectName = new Object(); $variableName = $objectName->execute(); // something } } 我要创建对象的模拟。我不想调用实方法execute()。我不知道如何用ph
class ClassName
{
public function MethodName()
{
// something
$objectName = new Object();
$variableName = $objectName->execute();
// something
}
}
我要创建对象的模拟。我不想调用实方法execute()。我不知道如何用phpunit来做这件事。
我知道依赖注入,但依我看,依赖注入并不能解决这个问题
谢谢你的回答。我为我的英语感到抱歉。事实上,这个案子可以通过依赖注射来解决。假设您不是在MethodName内实例化对象,而是注入它。无论是通过constructor、setter还是方法,对于原则来说都没有多大关系
class ClassName
{
public function MethodName(Object $objectName)
{
// something
$variableName = $objectName->execute();
// something
}
}
因为现在不在要测试的方法中实例化对象,所以可以在需要测试时向其传递模拟
public function testMethodName(){
$mock = $this->getMockBuilder('Object')->getMock();
$className = new ClassName;
$result = $className->MethodName($mock);
$this->assertTrue($result);
}
我没有运行这个testmethod,但我认为它说明了依赖注入的可测试性。我自己也不是专家。我确实认为编写测试也会使代码本身更干净,因为您可以更好地考虑其结构。这些都是很好的一般性谈话,对于青春痘和其他伟大项目的创造者的依赖性注射论点……我认为这种策略并不总是合适的。例如,如果需要在测试中的方法中创建的对象类似于\DateTime()。或者传递给事件调度器的事件对象。它确实取决于情况。模式和最佳实践不是法律,也不是100%适用的。在如何优雅地解决问题方面,他们通常能很好地处理问题。尽管如此,有时使用依赖注入仍然是有意义的。但不是对象实例本身,而是注入一个生成器或工厂。