15106


下記のテストで`User::where`で`test::double`を使っての返り値の固定ができませんでした。

Model

[code]

    class User extends Model
    {
      public static function isEmailExist($email)
      {
          if ( ! isset($email)) return false;
          $hit = (int)User::where('email', $email)->count();
          if ($hit > 0) {
              return true;
          }
          return false;
      }
    }
    
[/code]

unitTest

[code]

    <?php
    require_once __DIR__.'/../../app/User.php';
    use \AspectMock\Test as test;
    
    class UserTest extends \Codeception\TestCase\Test
    {
      /**
       * @var \UnitTester
       */
      protected $model;
    
      protected function _before()
      {
      }
    
      protected function _after()
      {
      }
    
      public function testisEmailExist()
      {
          $emailInstance = test::double('\App\User')->make();
          $emailInstanceProxy = test::double($emailInstance, ['count' => 1]);
          $emailClassProxy = test::double('\App\User', ['where' => $emailInstance]);
          $user = new \App\User();
          $this->assertEquals(true, $user->isEmailExist('test@co.jp'));
      }
    }
    
[/code]

この他にもいろいろ試しましたができません。  
返り値の固定方法を知っている方はいますか？


CC BY-SA 3.0
2015-08-26T10:01:23.400
14869
2015-10-01T01:30:58.900
2015-08-27T04:09:12.030
11075
11075
question
php laravel テスト
CodeceptionでAspectMock を使ってメソッドの変数を固定できる方法はありますか？


こんにちは。

[code]

    User::where('email', $email)->count();
    
[/code]

この`count`の結果を固定したい、ということだと思いますので、

[code]

        public function testisEmailExist()
        {
            test::double('Illuminate\Database\Eloquent\Builder', ['count' => 1]);
            $user = new \App\User();
            $this->assertEquals(true, $user->isEmailExist('test@co.jp'));
        }
    
[/code]

でうまくいかないでしょうか？  
（`User::where`の戻り値の型は`Illuminate\Database\Eloquent\Builder`になるため、その`count`をスタブ化します）

* * *

手元では以下の前提で期待通りに動きましたので、ご参考ください。  
（ご質問の内容からLaravel5, Codeception2.xと判断しました。）

## 前提環境

  * Laravel v5.0.33
  * Codeception 2.1.2
  * AspectMock 0.5.3

## tests/unit.suite.yml

[code]

    class_name: UnitTester
    modules:
    enabled:
        - Asserts
        - \Helper\Unit
        - Laravel5
    
[/code]

## tests/unit/bootstrap.php

[code]

    <?php
    $kernel = \AspectMock\Kernel::getInstance();
    $kernel->init([
        'appDir' => __DIR__ . '/../../app',
    ]);
    
[/code]


CC BY-SA 3.0
2015-09-01T01:07:37.530
15106
2015-09-01T01:07:37.530
11158
14869
answer