Is it possible, using PHPUnit mock objects, to expect a call to a magic __call() method?

人走茶凉 提交于 2019-12-20 10:26:40

问题


I've got a mock object in a test. The real object, PageRepository, implements a magic method using __call(), so if you call $pageRepository->findOneByXXXX($value_of_field_XXXX), it will search the database for records matching that parameter.

Is there a way to mock that method?

The real method call would look something like this:

$homepage = $pageRepository->findOneBySlug('homepage');

The test would look like this:

$mockPageRepository->expects($this->any())
    ->method('findOneBySlug')
    ->will($this->returnValue(new Page()));

But it doesn't work -- PHPUnit doesn't spot the method call. The only way to get it to see the method is to define the method explicitly in PageRepository.


回答1:


PHPUnit's getMock() takes a second argument, an array with the names of methods to be mocked. If you include a method name in this array, the mock object will contain a method with that name, which expects() and friends will work on.

This applies even for methods that are not defined in the "real" class, so something like the following should do the trick:

$mockPageRepository = $this->getMock('PageRepository', array('findOneBySlug'));

Keep in mind that you'll have to explicitly include any other methods that also need to be mocked, since only the methods named in the array are defined for the mock object.




回答2:


I found better way to do this. Still not perfect, but you don't have to specify all mocking class methods by hand, only magic methods:

    $methods = get_class_methods(PageRepository::class);
    $methods[] = 'findOneBySlug';
    $pageRepositoryMock = $this->getMockBuilder(PageRepository::class)
        ->disableOriginalConstructor()
        ->disableOriginalClone()
        ->disableArgumentCloning()
        ->disallowMockingUnknownTypes()
        ->setMethods($methods)
        ->getMock();


来源:https://stackoverflow.com/questions/6210695/is-it-possible-using-phpunit-mock-objects-to-expect-a-call-to-a-magic-call

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!