我正在测试一种方法,该方法在将社会保险号保存到数据库之前使用公钥加密社会保险号。它看起来像这样:
public function setSsnAttribute($value)
{
// Load the public key
$public = file_get_contents(Config::get('certificates.public'));
// Attempt to encrypt the social security number using the public key
if (!openssl_public_encrypt($value, $crypted, $public))
{
throw new Exception('Could not encrypt data. Nothing was stored.');
}
// The value of $crypted returned by openssl_public_encrypt contains
// binary characters. Rather than storing the data in a BLOB, I'm
// electing to use base64 encoding to convert it to a string that is
// suitable for storage in the database.
$crypted = base64_encode($crypted);
$this->attributes['ssn'] = $crypted;
}
问题在于Config::get('certificates.public')
电话。我想确保在加密步骤失败时抛出适当的异常。 Config::get('certificates.public')
中的值返回配置文件中定义的公共证书的路径。我的想法是,测试异常的最简单方法是为公共证书提供一条错误的路径。
我可以在配置文件中定义一个附加参数。我认为certificates.test.public.bad
的某些内容会返回/dev/null
或类似内容。
在单元测试期间指定备用配置参数的最佳做法是什么?在setSsnAttribute
方法中加载证书的路径似乎对我很怀疑。是否有更加测试友好的加载配置参数的方法?
答案 0 :(得分:1)
回到Laravel文档后,我意识到我可以通过在单元测试中调用Config::set()
参数来覆盖我需要的任何配置参数。例如:
/**
* @expectedException Exception
*/
public function testSsnDecryptionFailureThrowsException()
{
// Replace the private certificate with
Config::set('certificates.private', '/dev/null');
$application = FactoryMuff::create('Lease317\RentalApplication');
// I must access the attribute in order to trigger the decryption
$application->ssn;
}
这可以按预期工作,现在我在模型上有100%的代码覆盖率。