2011-06-06 29 views
1

我有一個方法調用存儲過程並在執行DataReader後返回數據。 我想用模擬來測試這個方法。我不知道如何返回值?如何模擬亞音速ExecuteReader方法?

任何人都這樣做了?感謝您的迴應。

這裏是我的代碼:

// Call the StoredProcedure 
    public List<string> GetCompletedBatchList(int fileId) 
    { 
     List<string> completedBatches = new List<string>(); 

     StoredProcedure sp = new StoredProcedure("GetDistributedBatches", this.dataProvider); 
     sp.Command.AddParameter("FileID", fileId, DbType.Int32, ParameterDirection.Input); 
     sp.Command.AddParameter("Result", null, DbType.Int32, ParameterDirection.InputOutput); 
     using (var rdr = sp.ExecuteReader()) 
     { 
      while (rdr != null && rdr.Read()) 
      { 
       if (rdr[0] != null) 
       { 
        completedBatches.Add(rdr[0].ToString()); 
       } 
      } 
     } 
     return completedBatches; 
    } 

下面是測試方法:

[Test] 
    public void Can_get_completedBatches() 
    { 
     var file = new File() { FileID = 1, DepositDate = DateTime.Now }; 
     repo.Add<File>(file); 

     CompletedBatches completedBatches = new CompletedBatches(provider.Object); 


     //Here I am not sure how to Return 
     provider.Setup(**x => x.ExecuteReader(It.IsAny<QueryCommand>())).Returns** => 
     { 
      cmd.OutputValues.Add(0); 
     }); 
     var completedBatchesList = completedBatches.GetCompletedBatchList(file.FileID); 
     Assert.AreEqual(0, completedBatchesList.Count()); 

    } 

回答

0

以下鏈接幫助我...... How to mock an SqlDataReader using Moq - Update

我用MockDbDataReader方法來模擬數據

[Test] 
     public void Can_get_completedBatches_return_single_batch() 
     { 
      var date = DateTime.Now; 
      var file = new File() { FileID = 202, DepositDate = DateTime.Now }; 
      var batch1 = new Batch() { FileID = 202, BatchID = 1767, LockboxNumber = "1", IsLocked = true, LockedBy = "testUser" }; 
      var transaction1 = new Transaction() { BatchID = 1767, TransactionID = 63423, CheckAmount = 100.0 }; 
      var distribution1 = new Distribution() { TransactionID = 63423, InvoiceNumber = "001", Amount = 100.0, DateCreated = date, DateModified = date, TransType = 2 }; 

      repo.Add<File>(file); 
      repo.Add<Batch>(batch1); 
      repo.Add<Transaction>(transaction1); 
      repo.Add<Distribution>(distribution1); 

      CompletedBatches completedBatches = new CompletedBatches(provider.Object); 

      provider.Setup(x => x.ExecuteReader(It.IsAny<QueryCommand>())).Returns(MockDbDataReader()); 

      var completedBatchesList = completedBatches.GetCompletedBatchList(202); 
      Assert.AreEqual(1, completedBatchesList.Count()); 

     } 


// You should pass here a list of test items, their data 
    // will be returned by IDataReader 
    private DbDataReader MockDbDataReader(List<TestData> ojectsToEmulate) 
    { 
     var moq = new Mock<DbDataReader>(); 

     // This var stores current position in 'ojectsToEmulate' list 
     int count = -1; 

     moq.Setup(x => x.Read()) 
      // Return 'True' while list still has an item 
      .Returns(() => count < ojectsToEmulate.Count - 1) 
      // Go to next position 
      .Callback(() => count++); 

     moq.Setup(x => x["BatchID"]) 
      // Again, use lazy initialization via lambda expression 
      .Returns(() => ojectsToEmulate[count].ValidChar); 

     return moq.Object; 
    } 
0

如果你想創建一個特定的形狀和大小的一個DataReader那麼我建議你看看DataTable.CreateDataReader DataTable.CreateDataReader。然後,您可以在您的示例中設置ExecuteReader以返回此數據讀取器。