【问题标题】:PhpSpec return always null on mocksPhpSpec 在模拟上总是返回 null
【发布时间】:2014-08-23 16:18:33
【问题描述】:

我正在使用 PhpSpec,由于某种原因,当我模拟我的依赖项并调用它们时,PhpSpec 的 willReturn 方法给我一个 null 值而不是传递的值。

这就是我要描述的方法

    /**
     * Register an User
     *
     * @param array $infoUser
     * @return User
     */
    public function register(array $infoUser)
    {

        $user = $this->user->create($infoUser);

        $this->raise(new UserRegistered($user));

        return $user;
    }

我的规格

class BaseAuthSpec extends ObjectBehavior
{
    function it_is_initializable()
    {
        $this->shouldHaveType('Core\Auth\BaseAuth');
    }

    function let(AuthManager $guard,UserAuthRepository $user)
    {
        $this->beConstructedWith($guard,$user);
    }

    function it_register_an_user(UserAuthRepository $useRepo)
    {
        $user = [
            'username' => 'fabri',
            'email'    => 'test@test.com',
            'password' => 'password',
            'repeat_password' => 'password'
        ];

        $userModel = new User($user);

        // this line return null instead the $userModel
        $useRepo->create($user)->shouldBeCalled()->willReturn($userModel);

        $this->raise(new UserRegistered($userModel))->shouldReturn(null);

        $this->register($user)->shouldReturn($userModel);
    }
}

我被这个问题困住了,任何建议都将不胜感激。

【问题讨论】:

    标签: php laravel-4 phpspec


    【解决方案1】:

    参数按名称匹配。传递给let() 方法的用户存储库与传递给it_register_an_user() 方法的用户存储库不同。要解决您的问题,只需为其命名即可。

    您的规范中还有其他问题。

    不可能在您指定的类上模拟或存根方法。这是行不通的:

    $this->raise(new UserRegistered($userModel))->shouldReturn(null);
    

    我不确定raise() 方法中发生了什么,但您应该在示例中正确处理它,因此要么存根或模拟任何协作者(如果没有与当前相关的返回值,则不要理会它们示例)。

    另一件事是,当您真正需要的是存根时,您会使用模拟。我会将您的示例改写为:

    class BaseAuthSpec extends ObjectBehavior
    {
        function let(AuthManager $guard, UserAuthRepository $userRepo)
        {
            $this->beConstructedWith($guard, $user);
        }
    
        function it_registers_a_user(UserAuthRepository $userRepo, User $userModel)
        {
            $user = [
                'username' => 'fabri',
                'email'    => 'test@test.com',
                'password' => 'password',
                'repeat_password' => 'password'
            ];
    
            $userRepo->create($user)->willReturn($userModel);
    
            $this->register($user)->shouldReturn($userModel);
        }
    }
    

    raise 方法应由单独的示例介绍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      相关资源
      最近更新 更多