2011-06-16 22 views
5

Veritabanı işlemleriyle dalga geçmeye çalışıyorum. SqlParameterCollection alayında sorun yaşıyorum. DbParameterCollection döndürecek virtual yöntemi oluşturmaya çalıştım ama SqlParameterCollectionAddWithValue vb gibi tüm işlevlerini kaybediyorum vb SqlParameterCollection alay edebilirim bir yolu var mı? DAL birim testine başka bir yaklaşım var mı? Ben Moq kullanıyorum.SqlParameterCollection öğesini Moq ile eşleştirin

Kod şöyledir: DALde

:

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(); 
      } 
    } 
} 

Birim testi projede: bir uzantısı yöntemi düzenlendi

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--

eklemek değeri olan parametre. Bana bu yöne işaret ettiğin için teşekkürler Marc Gravell.

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

Yeni oluşturulan parametre ile .Parameters.Add aramak istersin olur Metot ekle –

cevap

7

Kişisel olarak, DbCommand (veya IDbCommand) bir AddParameterWithValue uzantısı yöntemi yazarak sorunu yaklaşım. Komutta olmak zorundadır, böylece CreateParameter'a erişebilir ve ardından .Parameters.Add'u arayın.

Bu, günlük dekoratörleri gibi soyutlamalar da dahil olmak üzere tüm ADO.NET yığınlarına karşı kolay kullanım sağlar. O bir ile beklenen beri

+0

ilginç geliyor. – Asdfg

+0

@Asdfg Eğer ihtiyacınız varsa "dapper" in bunun bir versiyonunu bıraktığımı düşünüyorum –

+0

Bu harika olacak. Uzatma yöntemini yazıyorum ama orada mücadele ediyorum. – Asdfg

1

@Asdfg HI Temelde

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; 
     //*************************************************// 

Umut aşağıdaki gibi parametre koleksiyonunu alay var bu,