class MyClass {
private $numeric;
public function MyMethod($numeric)
{
if (! is_numeric($numeric)) {
throw new InvalidArgumentException
}
$this->numeric = $numeric;
}
}
1 -有必要测试类是否存在?
PHPUnit 有几个自动运行的方法,例如 assertPreConditions、setUp 等。有必要在这些方法中使用 assertTrue 和 class_exists 检查类是否存在?例子:
protected function assertPreConditions()
{
$this->assertTrue(class_exists("MyClass"), "The class does not exists.");
}
2 -有必要检查一个方法是否存在?如果是,这个测试应该是一个单独的测试还是在每个单元测试中?
假设我们有一个只接受数字类型参数的方法,那么我们有两个测试,一个带有正确参数的测试,另一个带有不正确方法的测试,期待异常,对吗?编写此方法的正确方法是...
这边走:
public function testIfMyMethodExists()
{
$this->assertTrue(method_exists($MyInstance, "MyMethod"), "The method does not exists.");
}
/**
* @depends testIfMyMethodExists
* @expectedException InvalidArgumentExcepiton
*/
public function testMyMethodWithAValidArgument()
{
//[...]
}
/**
* @depends testIfMyMethodExists
* @expectedException InvalidArgumentExcepiton
*/
public function testMyMethodWithAnInvalidArgument()
{
//[...]
}
还是这样?
public function testMyMethodWithAValidArgument()
{
$this->assertTrue(method_exists($MyInstance, "MyMethod"), "The method does not exists.");
}
/**
* @expectedException InvalidArgumentExcepiton
*/
public function testMyMethodWithAnInvalidArgument()
{
$this->assertTrue(method_exists($MyInstance, "MyMethod"), "The method does not exists.");
//[...]
}
为什么?
3 - @covers 和 @coversNothing 的真正目的是什么?
我正在阅读 PHPUnit 的创建者 Sebastian Bergmann 写的一个文档,作为一种好的做法,我们应该始终在方法和类中编写 @covers 和 @coversNothing 并在 xml 中添加这些选项:
mapTestClassNameToCoveredClassName="true"
forceCoversAnnotation="true"
并在白名单中:
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php"></directory>
</whitelist>
但它的真正需要是什么?
4 -测试调用另一个方法的构造函数的正确方法是什么?
似乎一切都很好,但不是在测试中。
即使我使用有效参数和无效参数进行测试,期望方法“MyMethod”出现异常,如果我在构造函数中输入不正确的值(测试失败),也不会发生这种情况。
如果我使用有效参数进行测试,代码覆盖率不会达到 100%。
public function __construct($numeric)
{
$this->MyMethod($numeric);
}