如何在不连接数据库的情况下测试服务功能

时间:2018-12-11 08:06:04

标签: symfony service doctrine-orm phpunit symfony4

我再次向你们求助,因为我将大部分时间都花在了这个“任务”上,而且在没有数据库功能连接的情况下,我仍然不知道如何测试我的服务方法(我必须模拟存储库功能)

这是我的服务功能

public function getInfo($history, $name)
{
    $requestRepository = $this->em->getRepository(Request::class);

    if ($history) {
        $requests = [];
        foreach ($requestRepository->getRequestsByName($name) as $request) {
            $requests[] = $requestRepository->transform($request);
        }
        return $requests;
    } else {
        $request = $requestRepository->getCompletedRequestByName($name);
        if (!is_null($request)) {
            return $requestRepository->transform($request);
        } else {
            return null;
        }
    }
}

这是我的考验

public function testGetInfo()
{
    /* This returns errors, because it tries to connect to DATABASE, but I don't wan't that, that's why I figure out I need to mock this
    $requestManager = new RequestManager($this->entityManager);
    $test = $requestManager->getInfo('histroy', 'antrax.com');
    */

    $requestManager = $this->getMockBuilder(RequestManager::class)->disableOriginalConstructor()->setMethods(['getInfo'])
        ->getMock();

    // And rest of this are just my FAILED attempts to figure out, how to test my methods
    $queryBuilder = $this->getMockBuilder(RequestRepository::class)->disableOriginalConstructor()
        ->setMethods(['getInfo'])->getMock();

    $test = $queryBuilder->method('getInfo')->willReturnSelf();

    $queryBuilder->method('getInfo')->willReturnCallback(function ($field, $value) use ($queryBuilder, $test){
        if ($field == 'newStatus') {
            $this->assertSame('EXPIRED', $value);
        }
        return $queryBuilder;
    });
}

请问有人可以帮我如何为我的方法getInfo编写测试,这样它将具有100%的覆盖率。如果您需要任何其他信息,请告诉我,我会提供。谢谢!

1 个答案:

答案 0 :(得分:0)

这是我的问题的答案

public function testGetInfo()
{
    $mockEntity = $this->mockEntityManager;

    $name = 'antrax.com';
    $requestMock = new RequestEntity();
    $transformedRequest = [
        'id' => 1
    ];

    $requestRepo = $this->getMockBuilder(RequestRepository::class)->disableOriginalConstructor()
    ->setMethods(['getRequestsByName', 'transform', 'getCompletedRequestByName'])->getMock();

    $requestRepo->method('getRequestsByName')->willReturnCallback(function ($passedName) use ($name, $requestMock) {
        $this->assertSame($name, $passedName);

        return [$requestMock, $requestMock];
    });

    $requestRepo->method('transform')->willReturnCallback(function ($request) use ($requestMock, $transformedRequest) {
        $this->assertSame($requestMock, $request);

        return $transformedRequest;
    });

    $i = 0;
    $requestRepo->method('getCompletedRequestByName')->willReturnCallback(function ($passedName) use ($name, $requestMock, &$i) {
        $this->assertSame($name, $passedName);
        if ($i == 0) {
            $i+=1;
            return null;
        } else {
            return $requestMock;
        }
    });

    $mockEntity->method('getRepository')->willReturnCallback(function ($requestClass) use ($requestRepo) {
        $this->assertSame(RequestEntity::class, $requestClass);

        return $requestRepo;
    });

    $requestManager = new RequestManager($mockEntity);
    $this->assertSame([$transformedRequest, $transformedRequest], $requestManager->getInfo(true, $name));

    $this->assertNull($requestManager->getInfo(false, $name));

    $this->assertSame($transformedRequest, $requestManager->getInfo(false, $name));
}