Pergunta

Eu gotton ao ponto no meu projeto simples, onde eu estou pronto para teste de unidade do DAL.

Basicamente, eu tenho uma classe chamada FooDataAccess com várias funções muito simples, digamos que 3 deles como esta:

int InsertFoo(string fooName)
void UpdateFoo(int fooID, string fooName)
void InsertFoosDepedency(int fooID, string someValue)

O que fiz foi isso - colocar 4 Scripts SQL dentro de meu projeto de teste de unidade, o último como recurso incorporado am.

1) Criar (unidade de teste) do Banco de Dados Script, 2) criar objetos Script, 3) Valores Inserir tabela de pesquisa e 4) Excluir todos os valores Mas pesquisa da tabela

A idéia é, qualquer um primeiro usando o projeto deve executar manualmente os scripts de 1-3 com a mão como uma configuração única. Em seguida, executar o script # 4 na start-up de cada teste de unidade ... (em pequenos aplicativos, você pode até mesmo executar todos eles em nível de teste)

OK, até aí tudo bem ...

Então, eu tenho a minha configuração de banco de dados de teste de unidade, como uma lousa vazia. Testando o primeiro InsertFoo function () é, obviamente, muito simples. Eu chamo a função, em seguida, basta Assert (ExecuteSQL ( "select count (*) from foo")> 1), Assert (ExecuteSQL ( "select fooName de t_foo") = esperado)), etc ..

Onde eu estou um pouco preso é aqueles que requerem dependências, como a terceira função no meu exemplo, ou mesmo a atualização.

faria sentido deixar cair temporariamente todas as restrições de chave estrangeira para o escopo do meu teste? Caso contrário, a fim de unidade de teste do InsertFoosDepedency função (int fooID, someValue string), eu teria que executar alguns SQL arbitrária primeiro (manualmente inserir um registro para a tabela de FOO e devolver o FooID) ...

OR, devo apenas fazer o último?

todo e qualquer feedback é muito apreciado.

UPDATE: O seu trabalho de forma limpa com SQL embutido para criar os dependentes. Eu acho que eu estou apenas olhando para comentários e criticismo sobre este método para teste de unidade DAL. Obrigado novamente

Foi útil?

Solução

Isso parece bastante semelhante ao que eu faço. I destruir todos os dados no banco de dados no início de cada de teste e, em seguida, construir apenas o que esse teste requer em que os testes estabelecidos fase. Assim, para UpdateFoo eu teria

void update_existingKey_updatesValue() {
   String expected = "jeff";

   clearDatabase();
   // Note I would use dbUnit.
   executeSQL("insert into foo values (1, 'fred')");

   DAL subject = new DAL(...);
   subject.update(1, expected);  

   //Note I would use dbUnit.   
   String actual = executeSQL("select name from foo where id = 1"); 
   assert(expected, actual);
}

Em Java eu ??uso uma ferramenta chamada DbUnit , seus nomes de métodos sugerem C #, então eu vou apontá-lo em dbUnit.Net no entanto Eu nunca usei isso. Isso proporciona uma agradável (IMO qualquer maneira) Método de preencher o banco de dados e verificar o conteúdo do banco de dados.

Outras dicas

Eu diria não muck ao redor com seu esquema para o bem dos testes. Se você não conseguir colocá-lo de volta ou seu código para colocá-lo novamente falhar, você vai encontrar-se em uma confusão muito rapidamente.

Você pode usar Mock Objects ?

Se não, eu acho que tudo o que você pode fazer é criar banco de dados pré-reqs para cada teste.

Você poderia considerar uma classe separada para cada configuração de teste e uso e métodos Teardown para obter o banco de dados na condição certa para os testes.

Ou você apenas tem que fazer a sua configuração específica de teste no método de ensaio (e você poderia usar Teardown para esvaziar o DB depois).

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