【问题标题】:Whats the right place for testhelper-classes? (phpunit/best practise)测试助手类的正确位置是什么? (phpunit/最佳实践)
【发布时间】:2011-04-18 07:55:15
【问题描述】:

我想用 PHPUnit 测试我的应用程序。所以我有我的应用程序类和像往常一样带有测试类的第二棵树。现在我需要对一种 Dummy/Mock-Objects 进行一些测试,我想知道我应该把它们放在哪里。它是一个不同的用例,它应该放在公共 lib 文件夹中还是更喜欢什么?

【问题讨论】:

  • 请查看您迄今为止给出的答案,要么接受解决您问题的答案,要么更新和改进您的问题,指出为什么这些都不能解决您的问题,以便人们有机会改进他们的答案。谢谢。
  • 一个很好的问题,有很好的答案。可惜了!

标签: php unit-testing phpunit


【解决方案1】:

在我不使用模拟对象而是为测试用例创建一次性子类的情况下,我使用测试用例的前缀命名该类,并将其放在测试用例本身之后的同一文件中。

测试用例前缀避免了类名与任何真实类发生冲突的可能性,并且将代码放在同一个文件中可以很容易地进行测试。如果你发现你需要为一个测试用例创建多个子类,这可能是你的类做太多的信号。

class MyClassTest extends PHPUnit_Framework_TestCase
{
    function setUp() {
        $this->fixture = new MyClassTest_DoesNothing;
    }
}

class MyClassTest_DoesNothing extends MyClass
{
    ...
}

【讨论】:

    【解决方案2】:

    我喜欢镜像我正在处理的项目的文件结构。

    /project
      app/
      app/models/BankAccount.php
      tests/
        suite/
          app
          app/models/BankAcountTest.php
        mocks
          app/
          app/models/BankAccountMock.php
    

    我发现这样做可以使一切井井有条。如果我不打算重用它们,我会将小的 Mocks 或存根放在测试用例文件中。正如在其他 cmets 中所述,大多数 Mocks 都可以由 PHPUnit 生成,但有时只需自己滚动即可。

    【讨论】:

      【解决方案3】:

      对于放置硬编码存根或模拟的位置没有建议的位置。每当我觉得需要将特定外部资源与需要这些资源的测试放在同一文件夹中时,我倾向于添加一个文件夹 _files。但这只是我。

      然而,PHPUnit 有一个内置的模拟框架,所以通常你不需要硬编码你的存根和/或模拟。见

      示例 10.2:存根方法调用以返回固定值

      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
              // 'foo'.
              $this->assertEquals('foo', $stub->doSomething());
          }
      }
      

      PHPUnit 的 Mocking 框架的替代方案是 Pádraic Brady's Mockery,其灵感来自 Ruby 的 flexmock 和 Java 的 Mockito

      【讨论】:

      • 好的,我的问题不够精确。我正在开发一个小库,其中一些类是抽象的,或者只有在应用程序类扩展时才有用。此时我只想为该库编写测试,但我需要这些 DummyApplication 类,因此我可以确定一切都按预期工作,并且我可以使用我的库传递测试。我在哪里离开虚拟班级?
      • @Daniel PHPUnit 的模拟框架也可以存根/模拟抽象类。请参阅Example 10.12: Testing the concrete methods of an abstract class
      猜你喜欢
      • 2012-01-08
      • 1970-01-01
      • 2016-07-26
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2017-11-16
      • 1970-01-01
      相关资源
      最近更新 更多