testhelper-classes的正确位置是什么?(phpunit) /最佳实践)


Whats the right place for testhelper-classes? (phpunit/best practise)

我想用PHPUnit测试我的应用程序。因此,像往常一样,我有我的应用程序类和第二个包含测试类的树。现在我需要测试一种Dummy/Mock-Objects,我想知道我应该把它们放在哪里。它是一个不同的用例,它应该放在公共lib文件夹或什么是更喜欢?

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

测试用例前缀避免了类的名称与任何实际类冲突的任何机会,并且将代码放在同一个文件中使得使用测试更容易。如果您发现您需要为一个测试用例创建多个子类,这可能是您的类做得太多的信号。

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

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

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

我发现这样做让一切都井井有条。如果我不打算重用它们,我将把小的mock或存根放在测试用例文件中。正如在其他评论中所述,大多数mock都可以由PHPUnit生成,但有时自己滚动更容易。

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

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

    PHPUnit手册中的Test double章节。
例10.2:stub方法调用返回一个固定值

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的mock框架的替代方案是Pádraic Brady的mock,它的灵感来自Ruby的flexmock和Java的Mockito