【问题标题】:PHPUnit mock object issuePHPUnit 模拟对象问题
【发布时间】:2012-09-26 03:06:04
【问题描述】:

我一定遗漏了一些东西,但我遵循了本教程:http://www.phpunit.de/manual/current/en/test-doubles.html

 <?php
    class SomeClass
    {
      public function doSomething()
      {
         // Do something.
         return 'bar';
      }
    }
 ?>

我的 StubTest 课程

class StubTest extends PHPUnit_Framework_TestCase
{
  public function testStub()
  {
    // Create a stub for the SomeClass class.
    $stub = $this->getMock('SomeClass');

    // Configure the stub.
    $stub->expects($this->any())
         ->method('doSomething')
         ->will($this->returnValue('foo'));

    // Calling $stub->doSomething() will now return
   $this->assertEquals('foo', $stub->doSomething());
  }
 }
 ?>

好吧,也许我遗漏了一些东西,但这不是调用 doSomething 的预期值吗?

如果我这样做$this-&gt;assertEquals('bar', $stub-&gt;doSomething());,它将失败。

它似乎是针对-&gt;will($this-&gt;returnValue('foo'));的基础

【问题讨论】:

  • 您的代码似乎没问题。你是什​​么意思“它失败了”? $stub->doSomething() 返回 'bar' 或者它可能返回 null 或测试崩溃?你用的是哪个版本的phpunit?

标签: php class object mocking phpunit


【解决方案1】:

你的测试应该通过了。主代码将返回“bar”,但您没有调用主代码。您嘲笑该对象以返回“foo”。因此,它应该返回“foo”,这就是您的测试显示的内容。

要使用 mock 从您的代码中模拟相同的返回,您可以执行以下操作:

$stub = $this->getMock('SomeClass');

// Configure the stub.
$stub->expects($this->any())
     ->method('doSomething')
     ->will($this->returnValue('bar'));

// Calling $stub->doSomething() will now return
$this->assertEquals('bar', $stub->doSomething());

这将使您的测试继续进行,就好像您调用了真正的函数并收到“bar”作为返回。

【讨论】:

  • 看到这是令人困惑的部分。似乎 assertEqual 将测试是否匹配 ->will($this->returnValue('bar'));在这种情况下,我认为它返回 foo,所以我说应该期望返回 foo。但是实际的方法返回栏不应该失败吗?
  • 永远不会调用实际的方法,这正是存根的目的。您永远不会测试存根本身,而是将其用于测试对象的依赖关系。
  • 如 fab 所示,您实际上并没有调用或使用原始代码。 Mock 旨在成为替代品。 Mock 用于允许返回您希望为测试返回的确切数据。这允许您的单元测试在函数返回您指定的值时处理代码。这允许您测试您的代码在返回“bar”而不是“foo”时的行为。另一个 Mock 将用于返回 'foo',因此您也可以对其进行测试。
  • 您还可以为您正在模拟的对象 (SomeClass) 创建单元测试,以测试它是否将 foo 适当地返回到所呈现的条件。
猜你喜欢
  • 2015-11-06
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2011-03-09
  • 2014-03-27
  • 1970-01-01
  • 2014-10-07
相关资源
最近更新 更多