Need Advice on mocking the sdk for unit and integration tests

Abierto
#1,476 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
25/100
Tipo de issue
Documentación
Claridad
Necesita aclaración
Estado de actividad
Estancado
Stack tecnológico
php

Línea de trabajo

El issue menciona GraphServiceClient, los generadores de solicitudes, los mocks de PHPUnit y el MockHandler de Guzzle, pero no incluye archivos del repositorio ni puntos de entrada de pruebas. Empieza siguiendo la construcción de solicitudes de GraphServiceClient y comparándola con la guía de pruebas de Guzzle enlazada; para darlo por terminado sería necesario contar con un enfoque de mocking documentado y compatible tanto para las pruebas unitarias como para las de integración.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

For unit testing a class in out application that uses the sdk there isn't an easy way to mock the sdk parts see code block below.
I had a dig aorund in the source and couldnt find anything helpful in regards to this. Though I did stumble onto somthing indicating it uses the guzzle client so I was wondering if there was a way to do this:
https://docs.guzzlephp.org/en/stable/testing.html#mock-handler
with the sdk?
Or if there was any other recomended approach?

I will also need to write integration tests and dont want to be letting it call out the the MS servers so the guzzle mock hadnler or something similar would be very useful.

<?php

use Http\Promise\Promise;
use Microsoft\Graph\Generated\Chats\Item\Messages\MessagesRequestBuilder;
use Microsoft\Graph\Generated\Users\Item\Messages\Item\MessageItemRequestBuilder;
use Microsoft\Graph\Generated\Users\Item\Messages\Item\Value\ContentRequestBuilder;
use Microsoft\Graph\Generated\Users\Item\UserItemRequestBuilder;
use Microsoft\Graph\Generated\Users\UsersRequestBuilder;
use Microsoft\Graph\GraphServiceClient;
use PHPUnit\Framework\TestCase;
use Psr\Http\Message\StreamInterface;

class SomeService {
    public function __construct(private GraphServiceClient $client)
    {
    }

    public function run(): void {
        $mimeEmail = $this->client->users()
            ->byUserId('testuser@testing.com')
            ->messages()
            ->byMessageId('SomeMessageId')
            ->content()
            ->get()
            ->wait();

        //do something with $mimeEmail;
    }
}

class SomeServiceTest extends TestCase
{

    public function testComponent(): void
    {
        $graphServiceClient = $this->createMock(GraphServiceClient::class);
        $mockUsersRequestBuilder = $this->createMock(UsersRequestBuilder::class);

        $graphServiceClient->expects(self::once())
            ->method('users')
            ->willReturn($mockUsersRequestBuilder)
        ;

        $userItemRequestBuilder = $this->createMock(UserItemRequestBuilder::class);
        $mockUsersRequestBuilder->expects(self::once())
            ->method('byUserId')
            ->with($this->email)
            ->willReturn($userItemRequestBuilder)
        ;

        $messagesRequestBuilder = $this->createMock(MessagesRequestBuilder::class);

        $userItemRequestBuilder->expects(self::once())
            ->method('messages')
            ->willReturn($messagesRequestBuilder);

        $messageItemRequestBuilder = $this->createMock(MessageItemRequestBuilder::class);

        $messagesRequestBuilder->expects(self::once())
            ->method('byMessageId')
            ->with('SomeMessageId')
            ->willReturn($messageItemRequestBuilder)
        ;

        $contentRequestBuilder = $this->createMock(ContentRequestBuilder::class);

        $messageItemRequestBuilder->expects(self::once())
            ->method('content')
            ->willReturn($contentRequestBuilder)
        ;

        $mimeMessagePromise = $this->createMock(Promise::class);

        $contentRequestBuilder->expects(self::once())
            ->method('get')
            ->willReturn($mimeMessagePromise)
        ;


        $stream = $this->createMock(StreamInterface::class);
        $mimeMessagePromise->expects(self::once())
            ->method('wait')
            ->willReturn($stream)
        ;

        $stream->expects(self::once())
            ->method('getContents')
            ->willReturn('Mime Contents')
        ;

        $service = new SomeService($graphServiceClient);

        $service->run();

        //Do assertions
    }

}
Lenguaje dominante
PHP
Estrellas
669
Forks
150
Merge medio
15 h 21 min
PR fusionados (30 d)
3

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoftgraph/msgraph-sdk-php

Todos los issues de microsoftgraph/msgraph-sdk-php

Issues similares

Más issues de PHP

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.