PhpSpec在mock上总是返回null


PhpSpec return always null on mocks

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

我被这个问题难住了,如有任何建议,我将不胜感激。

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

你的说明书中还有其他问题。

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

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

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

另一件事是,当您真正需要的是存根时,您使用mock。我把你的例子重写为:

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方法应该在单独的示例中包含。