如何使用pytest进行测试来模拟Python中的abastract类或接口

2024-04-26 06:11:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建一个界面,为我的控制器提供电子邮件验证

class EmailValidatorInterface(ABC):
    """ Interface to EmailValidator use case """

    @abstractmethod
    def is_valid(self, email: str) -> bool:
        """ Specific case """

        raise Exception("Should implement method: is_valid")

这是我的控制器实现

class SignUpController(RouteInterface):
    def __init__(self, emailValidator: EmailValidatorInterface):
        self.emailValidator = emailValidator

    def route(self, http_request: Type[HttpRequest]) -> HttpResponse:

如何为我的EmailValidator创建模拟? 我正在尝试使用mock.patch,但不知道如何初始化mock

看看我的测验

def test_should_return_400_if_invalid_param_is_provided():

    with mock.patch('EmailValidatorStub') as MockEmailValidator:
        MockEmailValidator.return_value.is_valid.return_value = False

    sut = SignUpController(EmailValidatorStub())
    attributes = {
        "name": faker.word(),
        "login": faker.word(),
        "email": "any_email",
        "email_confirmation": "any_email@mail.com",
        "password": "any_password",
        "password_confirmation": "any_password"
    }

    request = HttpRequest(body=attributes)
    httpResponse = sut.route(request)
    assert httpResponse.status_code == 500




Tags: selfreturnisemailrequestdefanypassword
1条回答
网友
1楼 · 发布于 2024-04-26 06:11:23

我认为这里不需要mock.patch,因为您可以使用依赖注入。换句话说,只需像平常一样创建一个子类,但添加特定于测试的实现:

class MockValidator(EmailValidatorInterface):
   pass

然后在测试中实例化它:

sut = MockValidator()

您可以为正在测试的每个场景创建一个单独的模拟类,也可以添加一个__init__()方法,该方法接受每个场景之间可能不同的参数。或者两者的某种结合。mock不应该包含任何逻辑,而应该只满足一个经过测试的特定场景

相关问题 更多 >