php 模拟应接收类型->获取接收对象

qgelzfjb  于 2023-02-18  发布在  PHP
关注(0)|答案(1)|浏览(94)

我对嘲弄和phpunit测试很陌生。
我创建了一个测试来检查是否有东西被写入了数据库。我使用了doctrine,我创建了一个我的doctrine_connection和doctrine_manager的模拟对象。
一切都运行得很好,但是我想得到给定的参数,用assertEqual检查它。
现在我正在做以下事情:

require_once "AbstractEFlyerPhpUnitTestCase.php";
class test2 extends AbstractEFlyerPhpUnitTestCase {

public function getCodeUnderTest() {
    return "../php/ajax/presentations/add_presentation.php";
}

public function testingPresentationObject()
 {
    // prepare
    $_REQUEST["caption"] = "Testpräsentation";
    $_SESSION["currentUserId"] = 1337;

    $this->mockedUnitOfWork->shouldReceive('saveGraph')->with(\Mockery::type('EFPresentation'));
    $this->mockedUnitOfWork->shouldReceive('saveGraph')->with(\Mockery::type('EFSharedPresentation'));
    $this->mockedDoctrineConnection->shouldReceive('commit');

    //run
    $this->runCodeUnderTest();
    global $newPresentation;
    global $newSharedPresentation;
    // verify
    $this -> assertEquals($newPresentation->caption,$_REQUEST["caption"]);
    $this -> assertEquals($newSharedPresentation->userId,$_SESSION["currentUserId"]);
 }
}

saveGraph正在获取EFPresentation对象。我需要的是该对象。
我想Assert等于EFPresentation-〉caption,但是从给参数的给定对象,现在我使用的是在add_presentation中创建的EFPresentation-〉caption。

vlju58qv

vlju58qv1#

你可以使用\Mockery::on(闭包)来检查参数。这个方法接收一个函数,这个函数将通过传递实际的参数被调用。在里面你可以检查你需要的任何东西,如果检查成功,你必须返回true。

// Laravel: Facade::shouldReceive('saveGraph')
    $this
      ->mockedUnitOfWork
      ->shouldReceive('saveGraph')
      ->with(
          \Mockery::on(fn ($newPresentation) {
              // here you can check what you need...
              return $newPresentation->caption === $_REQUEST["caption"];
      })
      // Multiple function parameters:
      // ->with(
      //     $firstArgSimpleDataType,
      //     \Mockery::on(fn ($arg2) => $arg2 instanceof ObjectClass && $arg2->value() === $expectedValue2),
      //     \Mockery::on(fn ($arg3) => $arg3 instanceof ObjectClass && $arg3->getValue() === $expectedValue3),
      // )
      ->andReturn(true);

一个警告是,当测试没有通过时,除非你放一些回显或者使用调试器,否则你不会得到任何关于原因的详细信息。
编辑:已编辑缺失的括号

相关问题