Ficar OO e Testável enquanto trabalha com um banco de dados

15

Quais são algumas estratégias OOP para trabalhar com um banco de dados, mas mantendo as coisas testáveis na unidade? Digamos que eu tenha uma classe User e meu ambiente de produção funcione com o MySQL. Eu vejo algumas abordagens possíveis, mostradas aqui usando PHP:

  1. Passe um $ data_source com interfaces para load() e save() , para abstrair a fonte de dados de back-end. Ao testar, passe um armazenamento de dados diferente.

    $user = new User( $mysql_data_source );
    $user->load( 'bob' );
    $user->setNickname( 'Robby' );
    $user->save();
    
  2. Use uma fábrica que acesse o banco de dados e passe a linha de resultado para o construtor do usuário. Ao testar, gere manualmente o parâmetro $ row ou minta o objeto em UserFactory :: $ data_source. (Como posso salvar as alterações no registro?)

    class UserFactory {
        static $data_source;
    
        public static function fetch( $username ) {
            $row = self::$data_source->get( [params] );
    
            $user = new User( $row );
            return $user;
        }
    }
    

Eu tenho Padrões de design e Código limpo aqui ao meu lado, mas estou com dificuldade para encontrar os conceitos aplicáveis.

    
por Annika Backstrom 02.02.2011 / 15:53
fonte

4 respostas

10

Então, o que você quer pegar são os Padrões de Arquitetura de Aplicativos Corporativos de Martin Fowlers (ele também fornece uma catálogo em seu site aqui ).

Nele, ele descreve vários padrões para abstrair o acesso a dados. A primeira abordagem que você descreve é Active Record . Sua segunda abordagem é semelhante ao Gateway de dados de tabela .

Uma abordagem ainda melhor é usar um O / RM para remover a necessidade de escrever o código de acesso a dados manualmente. Eu não usei PHP desde que estávamos preocupados com Y2K, mas wikipedia tem uma lista de opções para você . Eu não sei se eles são bons, no entanto. Eu posso lhe dizer algumas coisas para procurar em um O / RM:

  • Ignorância de persistência : o O / RM não deve forçar seus objetos de negócios a derivarem de uma interface / classe específica para participar da estratégia de acesso a dados.
  • Mapeamento de relações : você deve ser capaz de mapear os relacionamentos entre seus objetos (um cliente tem pedidos, pedidos têm itens de linha, itens de linha têm um produto, etc.)
  • Mapeamento Hieráquico : você deve ser capaz de mapear as hierarquias de classes para o banco de dados.
  • Sintaxe de Consulta / Suporte a Critérios : Você deve ser capaz de criar uma consulta em tempo de execução em termos de seus Objetos, não em termos do banco de dados, e o O / RM deve traduzir e executar a consulta no base de dados. Pontos extras se a consulta for uma cadeia strongmente tipada, em vez de uma string.

Existem outros fatores a serem considerados, mas esses são alguns dos mais importantes. Espero que isso ajude.

    
por 02.02.2011 / 20:18
fonte
6

IMHO depende do que você quer testar, se você quiser testar sua lógica de negócio você deve esboçar / zombar ( Martin Fowler ) você acessa os dados para que sua primeira sugestão seja um bom começo. Esta pergunta sobre o stackoverflow fornece um bom exemplo de C # (I tentei encontrar algumas amostras do PHP, mas não consegui encontrar nenhuma).

Se você quiser testar o acesso a dados em si, ele não é mais chamado de teste de unidade, mas sim de teste de integração. Leia aqui para uma orientação geral, esta questão stackoverflow também tem alguns links interessantes.

Se você quiser testar a lógica do procedimento armazenado em seu banco de dados, consulte xUnit TestPattern

Espero que isso ajude

    
por 02.02.2011 / 17:23
fonte
1

Esta não é necessariamente uma resposta imediatamente útil, mas se você está realmente preocupado com a testabilidade do banco de dados, você deve verificar como isso é feito no Ruby on Rails. Até onde eu sei, ninguém cobriu o assunto melhor ou mais intuitivamente.

    
por 02.02.2011 / 16:20
fonte
0

Eu recomendei que você verifique a solução do Symfony Framework para esse tipo de problema. Symfony é um framework php OO com testes funcionais.

Aqui está um link , eles usaram algo parecido com o que você está pensando.

    
por 02.02.2011 / 16:26
fonte