【问题标题】:PHPUnit Stub, I want to replace a function in testPHPUnit Stub,我想替换测试中的一个函数
【发布时间】:2011-12-26 06:07:15
【问题描述】:

所以我有这个构建器,它运行一个应该是公共的 buildClass 方法,它需要几个参数。

在我的测试中,我想完全删除这些参数并使用 PHPUnit 中的 Mock 添加一些完全不同的东西。

所以:来自:

class ClassBuilder{
  public function buildClass($id, $some, $vars){
    $class = new Class($id, $some, $vars);
    return self::getClass(db_Class, $class);
  }
}

所以你可能会在这里得到我的想法,我想制作一个模拟,以便它在那里执行返回功能。

$myClassStub->getMock("ClassBuilder");
$myClassStub->->expects($this->any())
    ->method("buildClass")
    ->with($this->anything(), $this->anything())
    ->will($this->returnCallback("getClass"));

但我不知道它是如何工作的。这就是我的想法,但我根本不知道在哪里提出论点。请帮帮我,非常感谢。

/马库斯

【问题讨论】:

    标签: php mocking phpunit stub


    【解决方案1】:

    如果有 ->with($this->anything(), $this->anything()) 示例,您可以省略它,以确保您将至少 2 个参数传递给该函数。

    除了你之外,我理解的是你想要返回一个不同的类。在这种情况下,我建议这样做:

    $yourClassToReturn = "..."; // create the class here
    
    $myClassStub->getMock("ClassBuilder");
    $myClassStub->expects($this->any())
        ->method("buildClass")
        ->with($this->anything(), $this->anything())
        ->will($this->returnValue($yourClassToReturn));
    

    【讨论】:

    • 好的,那么 $yourClassToReturn 也是一个模拟实例吗?所以我以同样的方式设置了那个。杰出的。但是,我想使用构建器构建的类是从 ClassBuilder 中的另一个类完成的。所以底线是我想在类生成器中运行一个函数,因为这是一个私有函数。这可能吗?
    • 关键是,当你模拟出 ClassBuilder 时,你不再关心它的私有方法,因为你的假“buildClass”无论如何都不会与它们交互。你只是告诉它“做这个”,没有任何逻辑。 (如果这是有道理的,我理解你的正确吗?:))
    • 我的意图是模拟部分功能,而不是测试其他部分。
    • @edorian 是 ->-> 应该删除的错字吗?
    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 2017-10-20
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2011-04-18
    相关资源
    最近更新 更多