Dans le passé, j'ai des tests unitaires écrits pour les opérations CRUD simples lors de la création d'accès aux données/code référentiel qui ressemblent quelque chose comme ceci:code EF4 En premier lieu, TDD, CRUD et Transactions
using(var connection = new WhateverConnection(connectionString))
{
connection.Open();
using(var transaction = connection.BeginTransaction())
{
try
{
//test the CRUD operation
}
finally
{
//gets rid of any stuff created during the test
transaction.Rollback();
}
}
}
je déconner autour avec EF4 Code First aujourd'hui, et j'ai réalisé que je ne sais pas comment ce scénario de test se traduit dans le lexique Entity Framework. Il semble que, si j'appelle DbContext.SaveChanges()
, il enregistre les validations et, même si AcceptAllChanges()
a été appelée ou non. Même en utilisant ObjectContext
au lieu de DbContext
, je ne peux pas comprendre comment ce scénario de test simple peut être recréé sans nettoyer manuellement tous les objets de simulation/test créés. J'ai lu this article on MSDN, mais TransactionScope
n'a pas vraiment de méthode de type Rollback
non plus. Est-ce que j'utilise TransactionScope
et n'appelle jamais Complete
? Existe-t-il une autre méthode ou manière d'utiliser DbContext et/ou ObjectContext pour effectuer un Rollback lors de tests unitaires? Ai-je besoin de complètement réajuster ma pensée pour TDD avec EF4 Code First?
Cela fonctionne. Cependant, je noterai que cela ne fonctionne pas contre Sql Server CE (SqlCe), qui est ce que beaucoup d'exemples de Code First que j'ai trouvé utilisent. En outre, le TransactionScope échouera si vous utilisez un Initializer de type 'RecreateDatabaseIfModelChanges', car DROP DATABASE n'est pas autorisé dans un TransactionScope. –