Pergunta

Eu estou tentando unidade testar algumas classes de .NET que (por boas razões projeto) requerem DbConnections para fazer seu trabalho. Para estes testes, eu tenho alguns dados na memória para dar como entrada para essas classes.

Isso de dados na memória poderia ser facilmente expressa como uma DataTable (ou um DataSet que contém esse DataTable), mas se outra classe foram mais apropriado que eu poderia usá-lo.

Se eu fosse magicamente capaz de obter um DbConnection que representava uma conexão com os dados na memória, então eu poderia construir meus objetos, tê-los executar suas consultas com os dados na memória, e assegurar que a sua saída expectativas combinados . Existe alguma maneira de obter um DbConnection de dados na memória? Eu não tenho a liberdade de instalar qualquer software adicional de terceiros para fazer isso acontecer, e, idealmente, eu não quero tocar o disco durante os testes.

Foi útil?

Solução

Ao invés de consumir uma DbConnection pode você consome IDbConnection e zombar dele? Fazemos algo semelhante, passe a simulação de um DataSet. DataSet.CreateDataReader retorna um DataTableReader que herda de DbDataReader.

Temos envolto DbConnection em nossa própria IDbConnection-como interface para que nós adicionamos um método ExecuteReader () que retorna uma classe que implementa as mesmas interfaces como DbDataReader. Em nossa simulação, ExecuteReader simplesmente retorna o DataSet.CreateDataReader serve-se.

Sons tipo de rotunda, mas é muito conveniente para construir um DataSet com possivelmente muitos conjuntos de resultados. Nós nomear as tabelas de dados após os procedimentos armazenados que representam os resultados, e nossa falsa IDbConnection agarra a tabela de dados direito baseado no proc o cliente está ligando. DataTable também implementa CreateDataReader por isso é bom para ir.

Outras dicas

Uma abordagem que eu usei é criar um banco de dados SQLite na memória. Isso pode ser feito simplesmente puxando no pacote System.Data.SQLite.Core NuGet ao seu projeto de teste de unidade, você não precisa de instalar qualquer software em qualquer outro lugar.

Embora soe como uma idéia realmente óbvio, não foi até que eu estava olhando para os testes de unidade Dapper que eu pensei que usar a técnica me! Veja o método "GetSqliteConnection" no

https://github.com/ Stackexchange / dapper-dot-net / blob / bffb0972a076734145d92959dabbe48422d12922 / Dapper.Tests / Tests.cs

Uma coisa a ter em conta é que, se você criar um sqlite db na memória e criar e tabelas Preencher, você precisa ter cuidado para não fechar a conexão antes de realizar suas consultas de teste porque a abertura de uma nova conexão em memória será obter uma conexão com um new banco de dados in-memory, não o banco de dados que você acabou de cuidadosamente preparado para os testes! Para alguns de meus testes, eu uso uma implementação IDbConnection personalizado que mantém a conexão aberta para evitar essa armadilha -. Por exemplo

https://github.com/ProductiveRage/SqlProxyAndReplay/blob/ master / testes / StaysOpenSqliteConnection.cs

TypeMock? (Você precisaria 'instalar' embora).

Tenha cuidado assumindo que dados * pode lhe dar ganchos apropriados para testar - o seu muito pior caso em geral. Mas você diz bom design Razões, então eu tenho certeza que é todo coberto: D

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