1

次のようなパリモデルがあります。

class User extends Model
{
    public function authenticate($signature)
    {
        $hash = hash_hmac('sha256', $this->email, $this->password);

        if ($hash == $signature)
            $this->_authenticated = true;

        return $this->_authenticated;
    }
}

これをPHPSpec2で仕様化したいのですが、いくつか問題があります。私は次のようなことをしたい:

$this->authenticate('test')->shouldReturn(true);

しかし、仕様で authenticate() メソッドにアクセスするにはどうすればよいですか? 答えは非常に単純かもしれないと思いますが、私は本当にそれを理解することができません...

4

2 に答える 2

2
<?php

namespace spec;

use PHPSpec2\ObjectBehavior;

class UserSpec extends ObjectBehavior
{
    function it_should_be_initializable()
    {
        $this->shouldHaveType('User');
    }

    function it_should_authenticate_if_proper_signature_given()
    {
        $signature = '...';
        $this->setEmail('...');
        $this->setPassword('...');

        $this->authenticate($signature)->shouldReturn(true);
    }
}

仕様の最初に、電子メールとパスワードから署名を作成する必要があります。User クラスにも電子メールとパスワードのいくつかのセッターを実装します。一般的には、それでうまくいくはずです:)

于 2013-02-07T18:08:44.563 に答える
1

これに関するいくつかの考え。

ユーザー モデルは、独自の動作を満たすためにコラボレーターと連携しています。このコラボレーターは 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;
    }
}
于 2013-04-09T00:21:56.213 に答える