具有日期时间对象的嘲弄功能

问题描述 投票:0回答:3

我试图模拟一个方法,该方法应该有一个传递给它的set值的datetime对象

$mock->shouldReceive('setDatetime')
            ->with($datetime)
            ->once;

我对嘲弄比较陌生,但我不明白'与'有什么关系。如果$ datetime是传递给'setDatetime'的确切对象,那么它完全满足条件。如果它是一个datetime对象,但不是完全相同的对象,即所有值都相同,但它是一个不同的实例化DateTime对象,那么它不起作用。我正在传递给setDatetime的Datetime对象已使用DateInterval进行了更改。无论如何,我可以测试正在接收的日期时间对象是否具有相同的值,即使它不是同一个对象。

php phpunit mockery symfony-2.8
3个回答
0
投票

这可以通过为with()提供一个闭包来实现。

为了给函数Mockery提供闭包给你一个Closure匹配器

Mockery\Matcher\Closure

这个类将关闭并使用它来匹配你得到的值。

你将如何实现这个是这样的:

$expectedDateTime = new DateTime();
$mock->shouldReceive('setDatetime')
            ->with
               (new Closure(
                 function($datetime) use ($expectedDateTime) {
                   return $datetime->getTimestamp() === $expectedDateTime->getTimeStamp()
                 }
               )
            )->once;

epextedDateTime当然是它应该的日期时间,但是这里添加了例如目的。如果你在断言之外不需要它,你也可以在闭包中创建该DateTime对象,那么你不需要在闭包中使用它。

当然,您可以在闭包中检查/断言您想要的任何内容作为示例我做了最简单的检查,检查时间戳是否相等。


0
投票

另一种解决方案是使用\Hamcrest\Matchers::equalTo。这样您就可以将比较显式设置为==(等于)而不是===(strict)。您只需要这个对象,因为对于基元,它会自动检查==比较作为后备。

例:

$mock->shouldReceive('setDatetime')
    ->with(\Hamcrest\Matchers::equalTo($datetime))
    ->once;

该文档编写以下内容:

最常见的匹配器是with()匹配器:

它告诉嘲笑它应该以整数1作为参数接收对foo方法的调用。在这种情况下,Mockery首先尝试使用===(相同)比较运算符匹配参数。如果参数是原语,并且如果它没有通过相同的比较,则Mockery会回退到==(等于)比较运算符。

当将对象作为参数匹配时,Mockery只进行严格的===比较,这意味着只有相同的$对象才匹配。

资料来源:http://docs.mockery.io/en/latest/reference/argument_validation.html


0
投票

当我想检查其中一个参数时,我遇到了一个问题,其中一个参数被认为是\ DateTime,但我并不特别感兴趣的是这个值,我需要检查另一个参数并返回该参数的特定数据这就是我做的:

$dataRepository->shouldReceive('someMethod')
  ->withArgs(function (...$args)) {
    // for example, $args[3] could be \DateTime, but I don't care about it
    return $args[1] = 99,
  })
  ->andReturn([
    new dataObject(99, 1),
    new dataObject(99, 2),
    new dataObject(99, 3),
  ]);

$dataRepository->shouldReceive('someMethod')
  ->withArgs(function (...$args)) {
    // for example, $args[3] could be \DateTime, but I don't care about it
    return $args[1] = 101,
  })
  ->andReturn([
    new dataObject(101, 1),
    new dataObject(101, 2),
    new dataObject(101, 5),
  ]);
© www.soinside.com 2019 - 2024. All rights reserved.