【问题标题】:test if array contains value using PHPUnit使用 PHPUnit 测试数组是否包含值
【发布时间】:2015-10-16 18:15:30
【问题描述】:

我创建了这个对象数组:

$ad_1 = new AdUnit(array('id' => '1', 'name' => 'Ad_1', 'description' => 'great ad', 'code' => 'alpha', 'widget_id' => '123'));
$ad_2 = new AdUnit(array('id' => '2', 'name' => 'Ad_2', 'description' => 'good ad', 'code' => 'delta', 'widget_id' => '456'));
$ad_3 = new AdUnit(array('id' => '3', 'name' => 'Ad_3', 'description' => 'bad ad', 'code' => 'sigma', 'widget_id' => '789'));
$adUnitArr = array($ad_1, $ad_2, $ad_3);

我想检查我从函数中获得的随机广告是否存在于数组中。获取广告的代码如下所示:

        $fixture = new AdGroup();
$fixture->setAds($adUnitArr);
$randad = $fixture->getRandomAd();

现在我想检查数组是否包含我收到的随机广告,我可以这样做:

$this->assertEquals(in_array($randad, $adUnitArr), 1); //check if ad in array

但我的问题是,有没有比我做的更好的断言或其他方法来检查这件事?我尝试使用assertArrayHasKey,但出现以下错误:

PHPUnit_Framework_Exception: Argument #1 (No Value) of PHPUnit_Framework_Assert::assertArrayHasKey() must be a integer or string

有什么想法吗?谢谢

【问题讨论】:

  • $this->assertEquals((int) in_array($randad, $adUnitArr), 1); //check if ad in array
  • $this->assertTrue(in_array($randad, $adUnitArr));

标签: php phpunit


【解决方案1】:

试试 assertContains 方法:

$this->assertContains( $randad, $adUnitArr );

【讨论】:

  • 当心bool$this->assertContains('foo', ['abc' => true]); 将是真的。
  • 这绝对是个bug?修复了吗?
  • @ChibuezeOpata 这不是错误,而是边缘情况。发生这种情况是因为 'foo' == true 的比较松散。在php中将非空字符串转换为布尔值将导致true。在使用 php 时,您必须时刻注意这一点。要强制进行严格比较,您可以使用丑陋的$this->assertContains('foo', ['abc' => true], '', false, true, true);
  • 这是一种观点。错误总是边缘情况。它们被称为错误,因为它们不是预期的。
  • @ChibuezeOpata 至少在 PHPUnit 9.6 中,GeekMagus 描述的测试没有通过。此外,如果合同允许您配置松散/严格比较,那么无论合同的签名是否丑陋,它都不是错误。
猜你喜欢
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2013-08-26
  • 2015-11-12
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多