Pergunta

Estou testando meu aplicativo de estrutura do Zend e gostaria de testar que algo acontece quando uma chave específica não é definida no registro. Esta é a função que estou testando:

protected function getDomainFromConfig() {
    $config = Zend_Registry::get('config');
    if (!isset($config->domain)) {
        throw new Exception('Please make sure you have "domain" set in your config file and your config file is being set in the Zend_Registry.');
    }
    return $config->domain;
}

Como posso despertar uma chave no registro? Eu tentei isso, mas não funcionou:

$config = Zend_Registry::get('config');
$config->__unset('domain');

Atualizar: O que eu realmente quero saber é como devo testar que meu método lança uma exceção quando a tecla "Domínio" no arquivo de configuração não estiver definida.

Foi útil?

Solução

A única maneira real de alterar o valor do objeto de configuração seria despejá -lo em uma variável, desativar o item em questão, peça ao registro para excluir a chave para configuração e depois redefini -lo.

<?php
$registry = Zend_Registry::getInstance();
$config = $registry->get('config');
unset($config->domain);
$registry->offsetUnset('config');
$registry->set('config', $config);
?>

No entanto, para que isso funcione, você teria que definir o objeto Zend_config como editável antes de ser definido no registro pela primeira vez.

Você deve considerar que não é prática recomendada editar o registro dessa maneira. Em particular, o objeto ZEND_CONFIG foi projetado para ser estático quando for instanciado originalmente.

Espero ter entendido seu problema bem o suficiente!

Outras dicas

Se a sua 'configuração' é realmente Zend_Config, então, por padrão, é somente leitura.Zend_Config O segundo parâmetro opcional do construtor é booleano $allowModifications, por padrão definido como false.

Você provavelmente cria Zend_Config_Ini dentro bootstrap.php com

new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', 
                    APPLICATION_ENVIRONMENT)

acrescentar $allowModifications param:

new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', 
                    APPLICATION_ENVIRONMENT, 
                    true)

Tentar:

unset($config->domain);

E depois se registre novamente $registry->config com o modificado Zend_Config classe. Observe que, como o Vartec disse, você terá que instanciar seu Zend_Config instância como editável:

$config = new Zend_Config('filename', true);

o __unset método que você está tentando ligar é um método mágico Isso é chamado quando você usa unset na instância.

Estou vendo que você está tentando excluir um valor na config $, onde o $ config é armazenado em zend_registry antes da exclusão. Portanto, se a exclusão do valor não afetar o valor de configuração $ armazenado em zend_registry, presumo que, ao ligar para Zend_registry :: get (), você está tendo o valor de $ config e não uma referência à $ config em Zend_registry. Portanto, quando você muda algo na configuração copiada $, ela não afetará a armazenada. Sugiro que você altere primeiro a config $ e depois substitua a config $ no registro, definindo a $ config em zend_registry novamente.

Para aqueles que desejam realizar o que o título pede, para despertar uma chave Zend_registry:

class My_Registry extends Zend_Registry
{
    /**
     *
     * @param type $index
     */
    public static function delete($index)
    {
        $instance = self::getInstance();

        if ($instance->offsetExists($index)) {
            $instance->offsetUnset($index);
        }
    }
}

Chamar pelo: My_Registry::delete('key')

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top