我知道我做错了什么,因为这很奇怪,我学习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"
}
}
我会使用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 机制实际上没有 那么 先进,但是开发者们总是在大脑中插入“复杂”和“混乱”来解释这句话