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

PHPUnit测试总是成功,无论是$this->once()还是$this->never()?

孔和畅
2023-03-14

我知道我做错了什么,因为这很奇怪,我学习PHPUnit已经有几天了。测试主题是receive()控制器操作:

class ReportController
{
    /**
     * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
     */
    private $dispatcher;

    public function __construct(EventDispatcherInterface $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }

    /**
     * @param \Gremo\SkebbyBundle\Message\InboudSkebbyMessage $message
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function receive(InboudSkebbyMessage $message)
    {
        $this->dispatcher->dispatch(SkebbyEvents::MESSAGE_RECEIVED,
            new InboundMessageEvent($message)
        );

        return new Response();
    }
}

当控制器抛出事件时,我需要模拟一个事件订阅服务器(实现symfony\component\eventdispatcher\eventsubscriberinterface)。有一个静态方法getSubscribedEvents()。测试方法帮助程序(获取模拟):

public function getMockSubscriber(array $events)
{
    $class = $this->getMockClass(
        'Symfony\Component\EventDispatcher\EventSubscriberInterface',
        array_merge(array_values($events), array('getSubscribedEvents'))
    );

    // Static stub method
    $class::staticExpects($this->once())
        ->method('getSubscribedEvents')
        ->will($this->returnValue($events))
    ;

    return new $class;
}
public function testApiCall()
{
    $client = $this->createClient();

    // Router (for route generation) and dispatcher (for subscribing the mock)
    $router    = $client->getContainer()->get('router');
    $dispatcer = $client->getContainer()->get('event_dispatcher');

    // Get mock event subscriber
    $subscriber = $this->getMockSubscriber(array(
        'messsage.received' => 'onMessageReceived'
    ));

    // Register the mock subscriber with the dispatcher
    $subscriber->expects($this->once())->method('onMessageReceived');
    $dispatcer->addSubscriber($subscriber);

    // Make the request
    $request  = Request::create(
        $router->generate('controller_receive'),
        'POST',
        array(
            'sender'    => 'sender',
            'receiver'  => 'receiver',
            'text'      => 'text',
            'timestamp' => time(),
            'smsType'   => 'smsType'
        )
    );

    $client->getKernel()->handle($request);
}
array(7) {
  'messsage.received' =>
  array(1) {
    [0] =>
    array(2) {
      [0] =>
      class Mock_EventSubscriberInterface_19b191af#34 (2) {
        ...
      }
      [1] =>
      string(17) "onMessageReceived"
    }
  }

共有1个答案

邵浩大
2023-03-14

我会使用mocked对象,而不是从类名创建新的对象:

public function getMockSubscriber(array $events)
{
    $subscriberMock = $this->getMock(
        'Symfony\Component\EventDispatcher\EventSubscriberInterface',
        array_merge(array_values($events), array('getSubscribedEvents'))
    );

    // Static stub method
    $class = get_class(subscriberMock);
    $class::staticExpects($this->once())
        ->method('getSubscribedEvents')
        ->will($this->returnValue($events))
    ;

    return $subscriberMock;
}
 类似资料:
  • 什么是 this? 我们已经列举了各种不正确的臆想,现在让我们把注意力转移到 this 机制是如何真正工作的。 我们早先说过,this 不是编写时绑定,而是运行时绑定。它依赖于函数调用的上下文条件。this 绑定与函数声明的位置没有任何关系,而与函数被调用的方式紧密相连。 当一个函数被调用时,会建立一个称为执行环境的活动记录。这个记录包含函数是从何处(调用栈 —— call-stack)被调用的,

  • 如果我只运行几个线程,其中一些线程调用静态函数,而另一些线程创建新实例。我希望在每次对的调用中获得当时实例的实际数量。 代码中的两个选项有区别吗? 如果我锁定“”,这是否意味着在构造函数退出synchronized块之前,我不能调用(假设我没有在getCount()上编写synchronize)。 如果我在代码中的某个地方执行同步块,它是只锁定同步块还是锁定所有“”代码? 从这里开始编辑:谢谢大家

  • 我的问题是:我是否应该修复我的单元测试,因为他们没有找到错误?单元测试不应该考虑其他类吗?我只是修改了我的生产性代码,因为集成测试覆盖这些内容就足够了。 编辑: 由于这些答复,似乎有必要进一步说明我的问题。我仍然不确定哪个测试负责什么。 好吧,我的测试有100%的代码复盖率,我创造的突变体被我的测试检测到,所以一切看起来都很好。 我的第二个类是一个处理程序,它负责在每次调用handler.next

  • 问题内容: 我有一个json流,可以像这样: 或类似的东西 在我的Java代码中,请执行以下操作: 在第一种情况下,上述方法不起作用,因为流中只有一个元素。如何检查流是an 还是an ? 我尝试过,但是没有用。 谢谢 问题答案: 这样的事情应该做到: 这样做的好处是,只需从一次获取属性值。由于获取属性值涉及遍历哈希树或类似的树,因此对于性能(价值而言)很有用。

  • JavaScript 中最令人困惑的机制之一就是 this 关键字。它是一个在每个函数作用域中自动定义的特殊标识符关键字,但即便是一些老练的 JavaScript 开发者也对它到底指向什么感到困扰。 任何足够 先进 的技术都跟魔法没有区别。— Arthur C. Clarke JavaScript 的 this 机制实际上没有 那么 先进,但是开发者们总是在大脑中插入“复杂”和“混乱”来解释这句话