python / python/cpython

unittest.mock.patch of a subclass poisons base class

Aberta
#117,507 4 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

stdlib type-bug
Linguagem predominante
Python
Estrelas
77.2k
Forks
36k
Métricas de merge de PRs
Métricas de PR pendentes

Descrição

Bug report

Bug description:

this is an entirely silly example boiled down from a much more complex one to demonstrate the behaviour. the actual code here is nonsensical (Test2 will always fail) but Test1 should work just fine -- the decoration of the subclass Test2 seems to also decorate Test1's methods unexpectedly

from unittest import mock

s = 0

@mock.patch(f"{__name__}.s", 5)
class Test1:
    def test_1(self):
        assert s == 5, s


@mock.patch(f"{__name__}.s", 2)
class Test2(Test1): pass

Test1().test_1()
$ python3.12 t2.py
Traceback (most recent call last):
  File "/Users/asottile/workspace/sentry/t2.py", line 14, in <module>
    Test1().test_1()
  File "/opt/homebrew/Cellar/python@3.12/3.12.2_1/Frameworks/Python.framework/Versions/3.12/lib/python3.12/unittest/mock.py", line 1387, in patched
    return func(*newargs, **newkeywargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/asottile/workspace/sentry/t2.py", line 8, in test_1
    assert s == 5, s
AssertionError: 2

the problem appears to be here: https://github.com/python/cpython/blob/ea94b3b149eeadf33c2f7c46f16dcda0adc7cf4e/Lib/unittest/mock.py#L1412

whereas I think it should always return a new callable instead of mutating a potentially unrelated method

CPython versions tested on:

3.12

Operating systems tested on:

macOS

Linked PRs
  • gh-117665
  • gh-117667
  • gh-117687

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Execute o reproducer fornecido para Python 3.12 e inspecione Lib/unittest/mock.py nas proximidades da linha 1412, onde a issue identifica o comportamento problemático. Revise os PRs vinculados gh-117665, gh-117667 e gh-117687 antes de fazer alterações; considera-se concluído quando aplicar um patch em uma subclasse não alterar mais o comportamento do método herdado observado por meio de Test1.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
python
Domínio
testing-qa
Tipo de issue
Bug
Dificuldade
3/5
Tempo estimado
1-2 dias
Status de atividade
Estagnada
Clareza
Claramente especificada
Facilidade para iniciantes
25/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.