【问题标题】:Mock method of object and return object value depend of method param对象的模拟方法和返回对象值取决于方法参数
【发布时间】:2016-12-20 14:53:17
【问题描述】:

有没有方法模拟方法和返回值取决于方法参数?我需要这个来模拟容器并获得服务。我尝试这样做:

$container = $this
        ->getMockBuilder(Container::class)
        ->getMock();

$container
        ->expects($this->any())
        ->method('get')
        ->with('logger')
        ->willReturn($this->loggerMock)//this is logger object
    ;
$container->expects($this->any())
        ->method('get')
        ->with('database')
        ->will($this->returnValue(self::$pdo));//database object

$this->dataProviderFactory = new DataProviderFactory($container);

当我调用它时: print_r($container->get('logger'));应该有 Logger 对象。

但这不起作用。我收到以下错误:

方法名称的期望失败等于调用零次或多次时失败

Parameter 0 for invocation Symfony\Component\DependencyInjection\Container::get('logger', 1) does not match expected value.
Failed asserting that two strings are equal.
Expected :'database'
Actual   :'logger'

【问题讨论】:

  • 这与你的问题无关,但你确定你的工厂需要依赖整个容器吗?只注入它需要的服务可能会更好,比如记录器和数据库连接。它使测试更容易一些。
  • 现在我不能按照您建议的方式执行此操作,因为我开发的应用程序结构原因

标签: php unit-testing symfony


【解决方案1】:

您可以通过在运行时使用回调函数对传递给方法的参数进行操作来做到这一点。

尝试以下方法:

$container = $this
    ->getMockBuilder(Container::class)
    ->getMock();

$container
    ->expects($this->any())
    ->method('get')
    ->will($this->returnCallback(function ($arg) {
        $map = [
            'logger'   => $this->loggerMock,
            'database' => $this->returnValue(self::$pdo)
        ];
        return $map[$arg];
    }))
;

【讨论】:

  • 谢谢!这就是我需要的:)
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2022-12-03
  • 2023-01-03
  • 1970-01-01
相关资源
最近更新 更多