场景
一个函数什么都不做有两种可能的情况:
场景1:没有return语句
您的函数什么都不做,因为您没有在其中执行操作,并且您没有在其中包含 return 关键字:
public function doNothing()
{
// Do nothing.
}
场景2:有return语句
您的函数什么都不做,因为您没有在其中执行操作,并且您确实包含 return 关键字没有表示任何返回值:
public function doNothing()
{
// Do nothing.
return;
}
其他场景
我将省略案例以处理以下情况:
您不返回任何内容但执行可在其他对象上测试的重要操作的情况。在这种情况下,您必须对修改后对象的结果状态进行单元测试。
如果你什么都不做,只返回一些东西,那么你应该对返回值进行单元测试。
浏览 PHP 手册中的文档
对于第一种情况,PHP 手册记录了函数的计算表达式将为null。它在这里说:http://php.net/manual/en/functions.returning-values.php 在注释中:
如果省略返回值,将返回 NULL。
对于第二种情况,PHP 手册记录了函数的求值表达式也将是null。它在这里说:http://php.net/manual/en/function.return.php 在注释中:
如果没有提供参数,则必须省略括号并返回 NULL。 [...]
结论
因此,清楚地记录了“什么都不做”的函数的计算结果必然为null。
如何测试一个什么都不做的函数
只要表达你的期望:
$this->assertNull( $sut->doNothing() );
通过这种方式你“锻炼”你的函数,你在它上面运行,使代码覆盖完成所有的行,并且你通过将其评估的null 值测试为表达式来“预期”“什么都没有发生”,记录在案。
如何测试一个什么都不做的构造函数
尽管如此,还是要测试构造函数……嗯……常识:构造函数的目的是什么?创建某种类型(类)的对象(实例),对吧?
所以...我更喜欢通过检查 $sut 是否已创建来开始 100% 的单元测试。这是我在编写新类的代码时编写的第一个测试。这是我什至在课程存在之前编写的测试。最后,这就是构造函数的用途。红条。然后我创建了这个类。绿条。
假设我有一个 Email 类,它接受一个字符串,并且只有在传递有效的电子邮件时才会创建,否则会抛出异常。这与您的问题非常相似。仅“允许创建”或“通过爆炸系统拒绝创建”的构造函数。
我通常会这样做:
//-------------------------------------------------//
// Tests //
//-------------------------------------------------//
/** @dataProvider validEmailProvider **/
public function testCreationIsOfProperClass( string $email )
{
$sut = $this->getSut( $validEmail );
$this->assertInstanceOf( Email::class, $sut );
}
/** @dataProvider invalidEmailProvider **/
public function testCreationThrowsExceptionIfEmailIsInvalid( string $invalidEmail )
{
$this->expectException( EmailException::class );
$this->getSut( $invalidEmail );
}
//-------------------------------------------------//
// Data providers //
//-------------------------------------------------//
public function validEmailProvider() : array
{
return
[
[ 'alice@example.com' ],
[ 'bob.with-several+symbols@subdomain.another.subdomain.example.verylongTLD' ],
]
}
public function invalidEmailProvider() : array
{
return
[
[ 'missing_at_symbol' ],
[ 'charlie@cannotBeOnlyTld' ],
]
}
//-------------------------------------------------//
// Sut creators //
//-------------------------------------------------//
private function getSut( string $email ) : Email
{
return new Email( $email );
}
由于我使用 PHP 7.0 并且我将类型放在任何地方,包括输入参数和返回类型,如果创建的对象不是电子邮件,getSut() 函数将首先失败。
但即使我写它省略了返回类型,测试也会测试预期会发生什么:new Email( 'valid@example.com' ); 本身就是一个表达式,它应该评估为 Email::class 类的“某事”。
如何测试做某事的构造函数
代码气味。构造函数可能不应该工作。如果有,只需存储参数。如果构造函数“确实有效”而不是存储参数,请考虑在 getter 上进行延迟处理,或者在工厂中委派该工作。
如何测试“除了存储参数什么都不做”的构造函数
就像之前一样 + 然后获取数据。
- 在您的第一个测试中测试创建是某物的实例。
- 然后在另一个不同的测试中,使用 getter 之类的东西来获取在构造函数中输入的内容,即使构造函数没有执行任何操作(除了存储它)。
希望这会有所帮助。