当前位置: 首页 > 知识库问答 >
问题:

Codeception\Util\Stub方法::精确和::once不起作用

岑和风
2023-03-14

我使用Codec0019\Util\Stub创建单元测试。我想确定我的方法调用了几次。为此,我使用方法'正是'。

例子:

use \UnitTester;
use \Codeception\Util\Stub as StubUtil;

class someCest
{
    public function testMyTest(UnitTester $I)
    {
        $stub = StubUtil::makeEmpty('myClass', [
            'myMethod' => StubUtil::exactly(2, function () { return 'returnValue'; })
        ]);
        $stub->myMethod();
    }
}

正如您所看到的,我曾经调用过myMethod。但测试通过了。method::once也存在同样的问题,因为该方法使用的是同一类PHPUnit\u Framework\u MockObject\u Matcher\u InvokedCount(下面的“Matcher”)。只有当我调用的次数超过预期次数时,测试才会失败(

抱歉,这是我的第一个问题。

更新

我的快速和糟糕的临时解决方案:

将存根添加到帮助器中

$I->addStubToVerify($stub);

方法添加到帮助器以验证:

protected $stubsToVerify = [];
public function verifyStubs()
{
    foreach ($this->stubsToVerify as $stub) {
        $stub->__phpunit_getInvocationMocker()->verify();
    }
    return $this;
}

在Cest的方法_after()中调用此方法:

public function _after(UnitTester $I)
{
    $I->verifyStubs();
}

共有3个答案

瞿兴朝
2023-03-14

您模拟的目标类中似乎不存在您的方法。

如果该方法存在,那么Codeception将用您提供的存根替换它。如果此方法不存在,则Codeception会将具有此名称的字段添加到存根对象。

这是因为方法和属性在同一数组中传递,所以Codeception没有其他方法来区分方法和属性。

因此,首先在类myClass中创建一个方法myMethod。

许奇
2023-03-14

不要将\Codeception\Util\Stub用于预期的::once(),而是将单元测试修改扩展\Codeception\Test\unit,然后使用$this-

例如:

class MyProcessorTest extends \Codeception\Test\Unit 
{
    public function testSomething()
    {
        $processor = new MyProcessor(
            $this->makeEmpty(EntityManagerInterface::class, [
                'remove' => Expected::never(),
                'persist' => Expected::once(),
                'flush' => Expected::once(),
            ])
        );

        $something = $this->somethingFactory(Processor::OPERATION_CREATE);
        $processor->process($something);
    }
}

干杯

南门鸿哲
2023-03-14

您需要将$this作为第三个参数传递给makeEmpty

$stub = StubUtil::makeEmpty('myClass', [
    'myMethod' => StubUtil::exactly(2, function () { return 'returnValue'; })
], $this);
 类似资料:
  • 问题内容: 我正在学习有关Java的知识,并且一直困扰着这个问题:当我尝试使用简单的方法(例如)时,编译器给我错误。这是代码: 该方法在Javadoc中定义。 这样做应该很简单,但是我真的不知道我在做什么错。 问题答案: 您已经创建了自己的类,并且没有使用内置的Java类。您尚未定义。

  • 问题内容: 我有一个像这样开始的函数: 我正在输入字符串“ 1 + 2 * 3 ** 4”,但是return语句根本没有删除空格,我也不知道为什么。我什至没有运气尝试过.replace()。 问题答案: Strip不会在所有地方(仅在开头和结尾)删除空格。尝试这个: 在这种情况下使用是多余的(显然,感谢评论员!)。 在我休息之前(感谢OP!)的PS Bonus有用片段:

  • 我已经覆盖了和所以我不太确定出了什么问题。它们是使用 Eclipse 生成的(来源 -

  • 看下面的代码: 该代码是从 netty 的安全聊天客户端类 http://netty.io/wiki/user-guide-for-4.x.html 修改而来的,并添加了行 在while循环之前。服务器上的输出不读取该行。我不明白为什么会这样,对我来说,ch.writeandflush方法本身似乎在循环之外不起作用。 如果我不应该在循环之外使用ch.writeandlfush,有没有更好的方法在启

  • 问题内容: 我正在使用WKWebView打开example.com,在那儿我有一个测试链接,该链接应该打开JS警报,但我无法在设备上显示该警报,仅当我查看该网站时它才能工作从浏览器。 我正在使用WKUIDelegate,并将这段代码添加到ViewController.swift文件中: 当我单击生成JS警报的链接时,在XCode控制台中看不到任何内容。 我想念什么? 问题答案: 有点晚了,但我想补

  • 我用编写的代码: 我的: 和错误: 未捕获(promise中)错误:在xmlHttpRequest.HandleError(xhr.js:87)的createError(createError.js:16)处出现网络错误 谁来帮帮我?