当模块已被修补时,在pytest中正确修补方法

时间:2020-10-28 20:31:03

标签: 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.license_api.LicenseContent')
    yield l_mock

LicenseContent提供用于许可证内容的api调用,并使用UserLicense。

UserLicense是第三方导入的类检查,用于检查用户拥有的许可证(使用加密货币),并提供三个目的。

  1. 所有用于检查许可证验证的加密方法。
  2. 如果用户通过方法isvalid()获得了有效许可证,则
  3. 通过方法userrole()设置对用户的正确授权

通过修补UserLicense,我可以测试isvalid,但是当我尝试修补方法以获取用户角色时,它不会将方法的返回值设置为admin,并且测试失败。

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

1 个答案:

答案 0 :(得分:0)

您可以修补模拟对象的 return_value

@pytest.fixture
def license_fixture(mocker):
    
    user_license = mocker.patch('api.license_api.UserLicense')
    user_license.return_value.userrole.return_value = 'admin'
    l_mock = mocker.patch('api.license_api.LicenseContent')
    yield l_mock

userrole 是一个实例方法,所以它是在 UserLicense 的实例上调用的,而不是类本身。实例是调用类的返回值。因此,您在修补时需要牢记这一点。

取自此answer

类似问题: