繁体   English   中英

在C#和Microsoft Fakes中的lambda表达式中通过引用参数

[英]Parameter by reference in a lambda expression in C# and Microsoft Fakes

我是Microsoft Fakes框架的新手,正在尝试填充一些标准的较旧的ADO.NET代码以完全绕过数据库连接以进行单元测试。 我已经成功地将SqlConnection,SqlCommand和SqlDataAdapter(通过DbDataAdapter)进行了Shim,并尝试伪造数据适配器上的Fill(DataSet)方法。 在我的假Fill运行后(手动将一个表添加到数据集)后,一切似乎都工作良好,被测试的代码似乎看不到我创建的数据集。 好像数据集对象是通过值而不是通过引用传递的。

这是被测试的代码(VB.NET):

Dim cn As New SqlConnection(DB("CIMS"))
Dim cmd As New SqlCommand
Dim ds As New DataSet
...
Dim da as New SqlDataAdapter(cmd)
da.Fill(ds)

这是单元测试(C#):

using (ShimsContext.Create())
{
    // arrange
     ShimSqlConnection.ConstructorString = (@this, connectionString) => new ShimSqlConnection();
    ShimSqlCommand.Constructor = (@this) => new ShimSqlCommand();
    ShimSqlConnection.AllInstances.Open = (@this) => { };
    ShimSqlConnection.AllInstances.Close = (@this) => { };
    ShimDbDataAdapter.AllInstances.FillDataSet = (DbDataAdapter @this, DataSet dataset) =>
    {
        dataset = new System.Data.DataSet();
        dataset.Tables.Add();
        return 0;
    };
...

在调试该测试时,代码流很好地进入了伪造的FillDataSet函数,数据集添加了表,但退出该函数后,ds引用的数据集在表集合中显示0个表。 我也尝试过设置DataSetName属性,该属性将被测试代码接受测试表达式中的内容,因此永远不会看到新名称。

目前,将我们的整个应用程序转换为更现代的数据访问技术尚不切实际。

我不再需要这个问题的答案。 我从伪造的Fill方法(.FakeDataSet)中删除了行dataset = new System.Data.DataSet() ),一切顺利。 我猜我正在用一个新的引用覆盖通过引用传递的数据集,并且正如预期的那样,调用代码无法访问该数据集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM