userver: pytest_userver.grpc.Mockserver Class Reference
Loading...
Searching...
No Matches
pytest_userver.grpc.Mockserver Class Reference

Detailed Description

Allows to install mocks that are reset between tests, see grpc_mockserver.

Definition at line 131 of file __init__.py.

Public Member Functions

None __init__ (self, *, MockserverSession mockserver_session, bool experimental=False)
 
MockDecorator __call__ (self, servicer_method)
 Returns a decorator to mock the specified gRPC service method implementation.
 
Callable[[str], MockDecorator] mock_factory (self, servicer_class)
 Allows to create a fixture as a shorthand for mocking methods of the specified gRPC service.
 
Servicer install_servicer (self, Servicer servicer)
 Installs as a mock servicer, the class of which should inherit from a generated *Servicer class.
 

Protected Attributes

 _mockserver_session = mockserver_session
 

Constructor & Destructor Documentation

◆ __init__()

None pytest_userver.grpc.Mockserver.__init__ ( self,
* ,
MockserverSession mockserver_session,
bool experimental = False )
Warning
This initializer is an experimental API, likely to break in the future. Consider using grpc_mockserver instead.

Initializes Mockserver.

Note
Mockserver is usually obtained from grpc_mockserver.

Definition at line 137 of file __init__.py.

Member Function Documentation

◆ __call__()

MockDecorator pytest_userver.grpc.Mockserver.__call__ ( self,
servicer_method )

Returns a decorator to mock the specified gRPC service method implementation.

Example:

import samples.greeter_pb2 as greeter_protos
import samples.greeter_pb2_grpc as greeter_services
async def test_grpc_client_mock_say_hello(service_client, grpc_mockserver):
@grpc_mockserver(greeter_services.GreeterServiceServicer.SayHello)
async def mock_say_hello(request, context):
return greeter_protos.GreetingResponse(
greeting=f'Hello, {request.name} from mockserver!',
)
response = await service_client.post('/hello?case=say_hello', data='tests')
assert response.status == 200
assert 'text/plain' in response.headers['Content-Type']
assert response.text == 'Hello, tests from mockserver!'
assert mock_say_hello.times_called == 1

Definition at line 150 of file __init__.py.

◆ install_servicer()

Servicer pytest_userver.grpc.Mockserver.install_servicer ( self,
Servicer servicer )

Installs as a mock servicer, the class of which should inherit from a generated *Servicer class.

  1. Write a service implementation:

    class GreeterServicerImpl(greeter_pb2_grpc.GreeterServiceServicer):
    def __init__(self) -> None:
    self.name: str = 'testsuite'
    self.should_fail: bool = False
    @override
    async def SayHello(
    self, request: greeter_pb2.GreetingRequest, context: grpc.aio.ServicerContext
    ) -> greeter_pb2.GreetingResponse:
    if self.should_fail:
    await context.abort(code=grpc.StatusCode.UNAVAILABLE, details='Greeter is down')
    return greeter_pb2.GreetingResponse(greeting=f'Hello, {self.name}!')
    @override
    async def SayHelloRequestStream(
    self, request_iterator: AsyncIterator[greeter_pb2.GreetingRequest], context: grpc.aio.ServicerContext
    ) -> greeter_pb2.GreetingResponse:
    names = []
    async for request in request_iterator:
    names.append(request.name)
    return greeter_pb2.GreetingResponse(greeting=f'Hello, {" and ".join(names)}')
    Note
    Inheritance from multiple *Servicer classes at once is allowed.
  2. Install servicer instance:

    @pytest.fixture(name='greeter_mock')
    def _greeter_mock(grpc_mockserver) -> GreeterServicerImpl:
    # install_servicer returns a proxy with callqueue functionality for each gRPC method.
    return grpc_mockserver.install_servicer(GreeterServicerImpl())
  3. Use service mock:

    async def test_install_servicer(service_client, greeter_mock):
    # Get the service's client to visit grpc_mockserver.
    await service_client.run_task('call-say-hello')
    # Member access is proxied to the servicer impl.
    greeter_mock.should_fail = True
    with pytest.raises(pytest_userver.client.TestsuiteTaskFailed, match='Greeter is down'):
    await service_client.run_task('call-say-hello')
    # gRPC method implementations are replaced with callqueues.
    assert greeter_mock.SayHello.times_called == 3

Definition at line 183 of file __init__.py.

◆ mock_factory()

Callable[[str], MockDecorator] pytest_userver.grpc.Mockserver.mock_factory ( self,
servicer_class )

Allows to create a fixture as a shorthand for mocking methods of the specified gRPC service.

Example:

import pytest
import samples.greeter_pb2_grpc as greeter_services
pytest_plugins = ['pytest_userver.plugins.grpc']
@pytest.fixture
def greeter_mock(grpc_mockserver):
return grpc_mockserver.mock_factory(greeter_services.GreeterServiceServicer)
@greeter_mock('SayHello')
async def mock_say_hello(mock_request, _mock_context):
return greeter_protos.GreetingResponse(
greeting=f'Hello, {mock_request.name} from mockserver!',
)

Definition at line 163 of file __init__.py.

Member Data Documentation

◆ _mockserver_session

pytest_userver.grpc.Mockserver._mockserver_session = mockserver_session
protected

Definition at line 148 of file __init__.py.


The documentation for this class was generated from the following file: