【问题标题】:How can I mock a abastract class or interface in Python using - testing with pytest如何使用 pytest 在 Python 中模拟抽象类或接口
【发布时间】:2021-04-05 20:33:57
【问题描述】:

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

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 但我不知道如何初始化模拟

看看我的测试

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



【问题讨论】:

    标签: python unit-testing testing pytest testunit


    【解决方案1】:

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

    class MockValidator(EmailValidatorInterface):
       pass
    

    然后在你的测试中实例化它:

    sut = MockValidator()
    

    您可以为您正在测试的每个场景创建一个单独的模拟类,也可以添加一个__init__() 方法,该方法采用可以在每个场景之间变化的参数。或者两者的某种组合。模拟不应包含任何逻辑,而应仅满足测试的特定场景。

    【讨论】:

    • 嗨,这是有道理的。我可以创建一个存根类 EmailValidatorStub(EmailValidatorInterface): 我关心它,为了解决多个场景......我会在这个存根类中添加逻辑,因为在某些情况下它应该返回 true,在某些情况下,它应该返回 false .这样对吗?我的意思是,在存根类中添加逻辑?我正在尝试使用 Clean-Architecture 方法来完成这个项目。好的,我知道我还可以创建一个或两个以上的存根类来支持这种情况......如果这是一个好的做法,我只是不这样做。
    • @user428745 模拟应该有最少的逻辑。这里的第三种选择是将值传递给__init__(),用于给定测试的场景。
    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2010-11-16
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多