我正在使用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);
}
}
我坚持这个问题,任何建议都会受到赞赏。
答案 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);
}
}
加注方法应该由单独的例子涵盖。