gpt4 book ai didi

php - 使用模拟测试在抽象类的构造函数中调用的公共(public)函数时未定义的函数

转载 作者:搜寻专家 更新时间:2023-10-31 21:36:15 26 4
gpt4 key购买 nike

我有一个抽象类,它在其构造函数中调用公共(public)函数。为了测试这些调用是否正确执行,我必须模拟抽象类。每当我这样做时,我都无法在构造函数中进行公共(public)函数调用。我收到以下错误:BadMethodCallException: Method::setData() does not exist on this mock object。以下代码可能更好地解释了我的问题。

<?php

namespace Example\Tests;

use Mockery as m;
use PHPUnit_Framework_TestCase;

abstract class Foo
{

private $data;

public function __construct(array $defaults)
{
foreach ($defaults as $key => $value) {
$this->setData($key, $value);
}
}

public function getData()
{
return $this->data;
}

public function setData($key, $value)
{
return $this->data[$key] = $value;
}
}


class ExampleTest extends PHPUnit_Framework_TestCase
{

public function testDefaultsAreAssignedToData()
{
$expected = ['foo' => 'bar'];

$foo = m::mock('\Example\Tests\Foo', [$expected]);

$this->assertEquals($expected, $foo->getData());
}
}

最佳答案

通常,您使用模拟来替代被测类的外部依赖项。在这种情况下,您只想测试类的真实行为,而不是处理类 Foo 的任何依赖项。在这种情况下,真的没有必要模拟,我只是定义一个抽象类的具体实例用于测试目的。也就是说,您可以重构为这样的东西。

class ConcreteFoo extends Foo
{
}

class ExampleTest extends PHPUnit_Framework_TestCase
{
public function testDefaultsAreAssignedToData()
{
$expected = ['foo' => 'bar'];

$foo = new ConcreteFoo($expected);

$this->assertEquals($expected, $foo->getData());
}
}

关于php - 使用模拟测试在抽象类的构造函数中调用的公共(public)函数时未定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18771292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com