PhpSpec在模拟时返回null

时间:2014-08-23 16:18:34

标签: php laravel-4 phpspec

我正在使用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);
    }
}

我坚持这个问题,任何建议都会受到赞赏。

1 个答案:

答案 0 :(得分: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);
    }
}

加注方法应该由单独的例子涵盖。