Skip to content

Phpunit12#5

Merged
gersonfs merged 17 commits into
masterfrom
phpunit12
May 14, 2026
Merged

Phpunit12#5
gersonfs merged 17 commits into
masterfrom
phpunit12

Conversation

@gersonfs

Copy link
Copy Markdown
Owner

No description provided.

gersonfs added 17 commits May 13, 2026 21:18
- Adiciona stubs reais para CakeRequest/CakeResponse (e subclasses
  dinâmicas), contornando a colisão entre o método method() dessas
  classes e a Method trait do MockObject no PHPUnit 12.
- Recria a semântica do removido MockBuilder::addMethods() via
  _extendWithStubMethods(), que gera no-ops para métodos ausentes.
- Quando $methods está vazio, agora aplica onlyMethods com todos os
  métodos públicos (incluindo abstratos) para que expects()->method()
  continue funcionando como no PHPUnit 10.
- ControllerTestCase passa a usar o helper getMock() em vez de
  getMockBuilder direto.
- Ajustes pontuais em ControllerTest::testReferer (remove chamada
  legada setReturnValue) e CakeFixtureManagerTest (passa name no
  construtor do TestCase mockado).
- CakeTestCase: descarta mock objects sem expectations antes da
  verificacao do PHPUnit, suprimindo os notices "No expectations were
  configured for the mock object" sem alterar comportamento
- CakeFixtureManager: declara a propriedade $_processed (era dinamica)
- CakeRequest::clientIp(): cast para string antes do trim()
- DboSourceTest: #[\ReturnTypeWillChange] nos metodos do MockPDO
- ValidationTest: casts (double) -> (float)
- ControllerTaskTest/ModelTaskTest: usa indice fora dos limites calculado
  a partir do numero real de tabelas, em vez de valor fixo que assumia
  poucas tabelas no banco de teste
- TranslateBehaviorTest::testFieldsRestoreAfterBind: fixa locale 'eng'
  (o teste dependia do locale padrao do ambiente)
- RouterTest: substitui getMock + new externo (incompativel com PHPUnit 12)
  por classes de duplo de teste concretas (MockConnectedRoute/MockReturnRoute)
- CakeStubTrait: metodos passados a getMock() agora retornam null quando
  nao ha retorno configurado (semantica do PHPUnit), em vez de invocar a
  implementacao real. Resolve testes de envio de arquivo (testFile*,
  testDispatchActionSendsFile) em que _flushBuffer/_clearBuffer reais
  manipulavam o buffer de saida e zeravam o conteudo capturado
- CakeResponseStub: adiciona wrappers para _setContentType, _isActive,
  _clearBuffer e _flushBuffer
- CakeTestCase: passa a lista de metodos mockados ao stub e ignora
  _cakeSetMockedMethods ao gerar stubs de subclasses
- CakeRequestTest: limpa CONTENT_TYPE/HTTP_CONTENT_TYPE no tearDown
CakeStubBuilder/CakeStubTrait passam a registrar stubs por indice de
invocacao quando o matcher e o shim de at(), em vez de sobrescrever o
stub anterior. Resolve falhas em testes que configuram retornos
diferentes para chamadas sucessivas do mesmo metodo (ex.:
RequestHandlerComponentTest::testRequestMethod,
SecurityComponentTest::testValidatePostUrlAsHashInput).
O shim mockava todos os metodos da classe (getMock() sem onlyMethods),
fazendo metodos concretos retornarem null. Agora coleta os metodos
abstratos via reflexao e usa onlyMethods(), preservando a implementacao
real dos metodos concretos. Resolve os 6 erros e 16 falhas de
ControllerTestCaseTest (generate()/testAction() retornavam null).
Os testes chamavam restore_error_handler() inline e tambem marcavam
_restoreError=true, fazendo o tearDown restaurar novamente (1 set, 2
restores) e remover o handler do proprio PHPUnit. Remove a chamada
inline e deixa o tearDown fazer a unica restauracao. Resolve 5 testes
"risky" e uma falha em cascata em CakeTimeTest.
Mesmo padrao do DebuggerTest: remove as chamadas inline de
restore_error_handler() nos testes que ja marcam _restoreError=true,
deixando o tearDown fazer a unica restauracao. Resolve 6 testes "risky".
Testes que verificam comportamento apenas via expects()->method() nos
stubs de CakeRequest/CakeResponse eram marcados como "risky" (did not
perform any assertions), pois o shim nao integra com o contador de
assercoes do PHPUnit. expects() agora registra uma assercao. Resolve
~45 testes risky em Network, Controller, Error e View.
Configure::bootstrap() chamava _setErrorHandlers() duas vezes mas so
restaurava o error handler entre as chamadas, deixando dois exception
handlers na pilha. Adiciona restore_exception_handler() para manter a
pilha limpa (1 handler ativo). ConfigureTest::testBootstrap agora
restaura os handlers instalados pelo bootstrap.
parse_url() retorna false para URLs com parametros nomeados do CakePHP
(ex.: /posts/index/page:1), fazendo _lastAction ficar vazio e quebrar o
hash do token de seguranca. Substitui parse_url() por separacao manual
de fragmento/query/host, preservando o comportamento anterior para URLs
comuns.
I18n::clear() agora faz um reset completo: alem de esvaziar os dominios,
zera o idioma resolvido e recria a instancia de L10n. Sem isso, o
idioma padrao capturado no construtor de L10n ficava preso e, quando um
teste anterior deixava Config.language definido, L10n::_setLanguage()
usava esse valor obsoleto como fallback, traduzindo no idioma errado.
I18nTest agora limpa Config.language e chama I18n::clear() no setUp/
tearDown. Resolve 45 falhas que so ocorriam ao rodar a suite inteira.
- setUp/tearDown limpam Config.language e chamam I18n::clear() para que
  o idioma de um teste anterior nao fique como default obsoleto do L10n
  e sobreponha o idioma pedido (mesma causa das falhas de I18nTest)
- testNiceShortI18n aceita "ene" ou "ene." pois alguns sistemas abreviam
  janeiro em es_ES com ponto final
O teste faz define('DEFAULT_LANGUAGE', 'en-us'), constante que nao pode
ser removida e passava a ser o default permanente de toda instancia de
L10n criada depois no mesmo processo. Isso fazia idiomas explicitos sem
catalogo (time_test, etc.) serem substituidos por 'en-us', quebrando
CakeTimeTest na execucao da suite completa (CI roda tudo num processo
so). RunInSeparateProcess + PreserveGlobalState(false) contem o efeito.
@gersonfs gersonfs merged commit 87a1a09 into master May 14, 2026
6 checks passed
@gersonfs gersonfs deleted the phpunit12 branch May 14, 2026 18:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant