【问题标题】:How to Mock Subsonic ExecuteReader method?如何模拟 Subsonic ExecuteReader 方法?
【发布时间】:2011-06-06 21:25:23
【问题描述】:

我有一个方法调用存储过程并在执行DataReader后返回数据。 我正在尝试使用模拟测试该方法。不知道怎么返回值?

有人做过吗?感谢您的回复。

这是我的代码:

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

    }

【问题讨论】:

    标签: subsonic inversion-of-control moq subsonic3


    【解决方案1】:

    如果您想创建特定形状和大小的 DataReader,那么我建议您查看 DataTable.CreateDataReader DataTable.CreateDataReader。然后,您可以在示例中设置 ExecuteReader 以返回此数据读取器。

    【讨论】:

      【解决方案2】:

      以下链接帮助了我... 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;
          }
      

      【讨论】:

        猜你喜欢
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 2014-06-07
        相关资源
        最近更新 更多