2011-06-16 11 views
5

Próbuję kpić operacje bazy danych. Mam problem z wyśmiewaniem SqlParameterCollection. Próbowałem utworzyćmetodę, która zwróci DbParameterCollection, ale potem tracę wszystkie funkcje, które daje SqlParameterCollection jak AddWithValue itp. Czy istnieje sposób, że mogę kpić SqlParameterCollection? Czy istnieje inne podejście do testu DAL na jednostkę? Używam Moq.Jak kpić SqlParameterCollection za pomocą Moq

Kod wygląda tak:

w DAL:

protected virtual IDbConnection GetConnection(string connectionString) 
{ 
    return new SqlConnection(connectionString); 
} 

protected virtual IDbCommand GetCommand(IDbConnection cn) 
{ 
    return cn.CreateCommand(); 
} 

protected virtual IDbTransaction GetTransaction(IDbConnection cn) 
{ 
    return cn.BeginTransaction(IsolationLevel.Serializable); 
} 

Public Bool InsertInDatabase(DataTable dt) 
{ 
    using (IDbConnection cn = GetConnection(cnstr)) 
     { 
     cn.Open(); 

      using (IDbTransaction tran = GetTransaction(cn)) 
      { 
       IDbCommand cmd = GetCommand(cn); 
       cmd.Transaction = tran; 
       cmd.Connection = cn; 
       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.CommandText = "sp_InsertInDatabase"; 
       SqlParameterCollection cmdParams = cmd.Parameters as SqlParameterCollection; 
       cmdParams.AddWithValue("@param1", dt); 
       cmd.ExecuteNonQuery(); 
      } 
    } 
} 

W projekcie badanej jednostki:

protected override IDbConnection GetConnection(string connectionString) 
    { 
     return Mock.Of<IDbConnection>(); 
    } 

    protected override IDbCommand GetCommand(IDbConnection cn) 
    { 
     return Mock.Of<IDbCommand>(); 
    } 

    protected override IDbTransaction GetTransaction(IDbConnection cn) 
    { 
     return Mock.Of<IDbTransaction>(); 
    } 

    public void TestInsertInDatabase() 
    { 
     base.InsertInDatabase(new DataTable()); 
    } 

--Solution--

Stworzył metodę rozszerzenia aby dodać parametr z wartością. Dziękuję Marc Gravell za skierowanie mnie w tamtą stronę.

public static IDbDataParameter AddParameterWithValue(this IDbCommand cmd, string paramName, object paramValue) 
    { 

     var dbParam = cmd.CreateParameter(); 
     if (dbParam != null) 
     { 
      dbParam.ParameterName = paramName; 
      dbParam.Value = paramValue; 
     } 
     return dbParam; 

    } 
+0

Możecie chcesz zadzwonić .Parameters.Add z nowo utworzonego parametru, ponieważ oczekuje się ze związkiem Dodaj metodę –

Odpowiedz

7

Osobiście podejść do tego problemu pisząc metodę AddParameterWithValue rozszerzenie do DbCommand (lub IDbCommand). Musi on być na komendzie, aby uzyskać dostęp do CreateParameter, a następnie zadzwonić pod numer .Parameters.Add.

Pozwala to na łatwe użycie dowolnego stosu ADO.NET, w tym abstrakcji, takich jak dekoratory do rejestrowania.

+0

brzmi interesująco. – Asdfg

+0

@Asdfg Myślę, że zostawiłem wersję tego w "dapper", jeśli potrzebujesz to –

+0

To będzie fajne. Piszę metodę rozszerzenia, ale walczę tam. – Asdfg

1

@Asdfg Witam mam w zasadzie szydzili zbiór parametrów jak poniżej

string connectionString = "connectionstring"; 
     var sqlConnection = new SqlConnection(connectionString); 
     var command = sqlConnection.CreateCommand(); 
     //****************Setup Mock************************// 
     Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(typeof(System.Data.SqlClient.SqlClientPermissionAttribute)); 
     var mockDataReader1 = new Mock<IDataReader>(); 
     command.Parameters.Add(new SqlParameter("@po_tint_Result", 1)); 
     //setup read return value 
     Queue<bool> responseQueue = new Queue<bool>(); 
     responseQueue.Enqueue(true); 
     responseQueue.Enqueue(false); 
     mockDataReader1.Setup(a => a.Read()).Returns(() => responseQueue.Dequeue()); 
     var mockDb = new Mock<SqlDatabase>(connectionString); 
     mockDb.Setup(a => a.GetStoredProcCommand("SPNAME")).Returns(command); 
     mockDb.Setup(a => a.ExecuteNonQuery(command)); 
     obj1.DbConn = mockDb.Object; 
     //*************************************************// 

nadzieję, że to pomaga

Powiązane problemy