【问题标题】:How to assert that method has been called with expected data?如何断言该方法已被预期数据调用?
【发布时间】:2021-04-30 02:52:32
【问题描述】:

我有以下代码:

class CreateProfile:
    def __init__(self, profile_repository):
        self.profile_repository = profile_repository

    def __call__(self, create_profile_request):
        if self.profile_repository.exists_by_user_id(create_profile_request.user_id):
            raise ProfileAlreadyExists(create_profile_request.user_id)
        profile = Profile(create_profile_request.user_id, None, None, None, None)
        self.profile_repository.create(profile)

经过以下测试:

@patch("profile.core.service.create_profile.Profile")
def test_should_create_empty_profile(
    Profile, profile_repository, create_profile_request, service
):
    profile = ProfileFactory(user_id=sentinel.profile_id)
    Profile.return_value = profile
    service(create_profile_request)
    profile_repository.create.assert_called_with(profile)
    assert sentinel.profile_id == profile.id
    assert None is profile.name
    assert None is profile.nick
    assert None is profile.bio
    assert None is profile.status

问题是,如果对代码进行以下更改,测试仍然是绿色的。

class CreateProfile:
    def __init__(self, profile_repository):
        self.profile_repository = profile_repository

    def __call__(self, create_profile_request):
        if self.profile_repository.exists_by_user_id(create_profile_request.user_id):
            raise ProfileAlreadyExists(create_profile_request.user_id)
        profile = Profile(create_profile_request.user_id, None, None, None, None)
        id = profile.id
        profile.id = None
        self.profile_repository.create(profile)
        profile = id

虽然这种更改有点愚蠢,因此不会发生,但我觉得我在测试用例中遗漏了一些东西,因为我无法确定我发送到存储库的数据是否正确已被调用。我曾经写过一段代码来存储参数的副本,并让方法模拟side_effect 来执行它,然后检查已存储的数据,但似乎有人已经做过,而我没有发现像这样做的任何事情我都被以下问题困扰:

我应该对此进行测试吗?如果是的话,我该如何正确地做到这一点?

【问题讨论】:

    标签: python unit-testing mocking pytest


    【解决方案1】:

    我建议研究模拟您尝试执行的呼叫并利用 assert_called_with 功能。

    我强烈推荐这个video 来熟悉补丁功能和整体模拟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多