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