これに関するいくつかの考え。
ユーザー モデルは、独自の動作を満たすためにコラボレーターと連携しています。このコラボレーターは hash_hmac 関数です。PHPSpec の黄金律は Subject Under Specificationであり、一度に 1 つのクラスに取り組み、後で協力者の実装の詳細を検討します。これは、関心の分離の原則を念頭に置いてクラスを設計するのに役立っていることがわかりました。そして、このクラスは実際に何を気にかけているのかという質問をよくします。
たとえば、UserModel
システムがパスワードを保護するために使用しているハッシュ アルゴリズムを気にする必要はありません。HashingProvider
ただし、パスワードをハッシュする機能、または 1 つ以上の文字列を受け取って何らかのハッシュ表現を返す機能を備えた と呼ぶオブジェクトについて知ることはできます。
このような方法で再構築することにより、PHPSpecUserModel
のモッキング (素晴らしい話はこちらUserModel
) を最大限に活用して、最初の実装に集中し、その後、HashingProvider
仕様は次のようになります。
<?php
namespace spec;
use PHPSpec2\ObjectBehavior;
class User extends ObjectBehavior
{
function it_should_be_initializable()
{
$this->shouldHaveType('User');
}
/**
* @param /Some/HashingProvider $hashProvider
*/
function it_should_authenticate_if_proper_signature_given($hashProvider)
{
$this->setEmail('email');
$this->setPassword('password');
$hashProvider->hash('email', 'password')->willReturn('signature');
$this->authenticate('signature', $hashProvider)->shouldReturn(true);
}
/**
* @param /Some/HashingProvider $hashProvider
*/
function it_should_not_authenticate_if_invalid_signature_given($hashProvider)
{
$this->setEmail('email');
$this->setPassword('password');
$hashProvider->hash('email', 'password')->willReturn('signature');
$this->authenticate('bad_signature', $hashProvider)->shouldReturn(false);
}
}
User モデルは、仕様で説明されている方法でそのコラボレーターを使用できます。
<?php
class User extends Model
{
public function authenticate($signature, $hashProvider)
{
$hash = $hashProvier->hash($this->email, $this->password);
if ($hash == $signature)
$this->_authenticated = true;
return $this->_authenticated;
}
}