Creare stored procedure nel database di sforzo per Unit Test

c# effort entity-framework stored-procedures unit-testing

Domanda

Ho una funzione che chiama una stored procedure con Entity Framework:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

E vorrei creare un test unitario usando Effort. Ho già uno sforzo (e un database NMemory) per simulare un database (basato sul mio contesto), su Initialize per ogni Unit Test, come:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

Dove EffortProviderFactory è:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

Ho provato ad aggiungere la creazione della procedura memorizzata in questo modo:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

Ma lancia una NotSupportedException . Come posso fare, e qual è il modo migliore?

Risposta accettata

Lo sforzo è un provider di database in-memory basato su file che fornisce un'istanza di DbContext con un database temporaneo di proprietà privata: nuovo contesto, nuovo database, nessuna interazione di test. Questa è la parte buona.

Lo svantaggio, ovviamente, è che non è - e mai lo sarà - un vero e proprio motore di database. Pertanto non supporterà mai le stored procedure scritte in nessuno dei comuni dialetti SQL (come t-SQL o PL-SQL). Per quanto riguarda lo sforzo (cioè NMemory) ha stored procedure, è semplicemente un IQueryable memorizzato, come è evidente dal costruttore StoredProcedure . Notando in remoto le procedure memorizzate t-SQL.

L'unico modo per testare le stored procedure nel codice del livello di accesso ai dati, che è un'ottima idea, è scrivere test di integrazione. Ci sono approssimativamente due approcci per rendere i test di integrazione indipendenti l'uno dall'altro:

I test di integrazione non saranno mai così veloci come i test unitari e completano solo i test unitari, ma tuttavia, nella mia pratica di codifica relativa ai livelli di dati, sono diventati cittadini di prima classe nella suite di test. Per me, la correttezza è più importante della velocità.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché