在模块已修补时正确修补pytest中的方法

在模块已修补时正确修补pytest中的方法,pytest,pytest-mock,Pytest,Pytest Mock,我们有一个测试夹具,它修补两个类,如下所示 @pytest.fixture def license_fixture(mocker): mocker.patch('api.license_api.UserLicense') mocker.patch('api.license_api.UserLicense.userrole', return_value = 'admin') # doesn't work. l_mock = mocker.patch('api.li

我们有一个测试夹具,它修补两个类,如下所示

@pytest.fixture
def license_fixture(mocker):
    
    mocker.patch('api.license_api.UserLicense')
    mocker.patch('api.license_api.UserLicense.userrole', return_value = 'admin') # doesn't work.
    l_mock = mocker.patch('api.license_api.LicenseContent')
    yield l_mock
LicenseContent为许可证内容的api调用提供服务,并使用UserLicense

UserLicense是针对许可证用户的第三方导入的类检查(使用加密)并为三个用户提供服务

  • 检查许可证验证的所有加密方法
  • 如果用户通过方法isvalid()拥有有效的许可证
  • 通过方法userrole()设置用户的正确授权
  • 通过修补UserLicense,我可以测试isvalid,但是当我尝试修补该方法以获得用户角色时,它不会将方法的返回值设置为admin,并且测试失败


    修补方法的正确方法是什么?

    您可以修补模拟对象的
    返回值:

    @pytest.fixture
    def许可证固定装置(模拟装置):
    user\u license=mocker.patch('api.license\u api.UserLicense'))
    user_license.return_value.userrole.return_value='admin'
    l\u mock=mocker.patch('api.license\u api.LicenseContent')
    产量l_mock
    
    userrole
    是一个实例方法,因此它是在
    UserLicense
    的实例上调用的,而不是类本身。实例是调用类的返回值。因此,在修补时,您需要记住这一点

    摘自

    类似问题:


    此命令的目的是什么:
    mocker.patch('api.license\u api.UserLicense')
    ?它除了引起错误之外什么都不做。它实际上模拟了整个类。