代码之家  ›  专栏  ›  技术社区  ›  Raheel

模拟对象发出错误的方法调用异常PHPUnit

  •  0
  • Raheel  · 技术社区  · 8 年前

    测试以下方法

    public function handle($loginDetails): User
    {
        $authUser = $this->user->where('user_id', $loginDetails->id)->first();
        if (!$authUser) {
            $authUser = $this->user->create([
                'name' => $loginDetails->name,
                'email' => $loginDetails->email,
                'profile_image' => $loginDetails->avatar_original,
                'user_id' => $loginDetails->id
            ]);
        }
    
        return $authUser;
    }
    

    我正在模拟和测试它,如下所示

    public function shouldHandleNewUser()
    {
            $mockBuilder = $this->getMockBuilder(Builder::class)
                ->disableOriginalConstructor()
                ->setMethods(['first'])
                ->getMock();
            $mockBuilder->method('first')
                ->willReturn(null);
    
            $mockUser = $this->getMockBuilder(User::class)
                ->disableOriginalConstructor()
                ->setMethods(['where', 'create'])
                ->getMock();
    
            $mockUser->method('where')
                ->willReturn($mockBuilder);
    
            $mockUser->method('create')
                ->willReturn(new User());
    
            $loginDetails = new class {
                public $id = 1;
                public $name = 'testUser';
                public $email = 'test@test.com';
                public $avatar_original = 'http://someurl.com/image.jpg';
            };
    
            $registrationHandler = new RegistrationHandler($mockUser);
            $this->assertInstanceOf(User::class, $registrationHandler->handle($loginDetails));
    }
    

    当它到达 create 它抛出的方法

    PHPUnit\u Framework\u MockObject\u BadMethodCallException

    我做错了什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   ishegg    8 年前

    你不能嘲笑 static 使用PHPUnit的方法(我假设 User::create() 是静态的)。

    限制:final、private和static方法

    请注意 final , private , protected 静止的 方法不能 被打短棍或嘲笑。他们被PHPUnit的双重测试忽略了 并保留其原始行为。

    过去有一个 staticExpects() 方法来解决它。它在PHPUnit 3.8中被弃用,在PHPUnit 3.9中被删除。像 Sebastian Bergmann says ,解决方法是不使用 静止的 方法(我同意他的观点)

    推荐文章