我想用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章节。
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