C# 在运行时添加字段-Microsoft Fakes Framework

C# 在运行时添加字段-Microsoft Fakes Framework,c#,linq,unit-testing,linq-to-sql,microsoft-fakes,C#,Linq,Unit Testing,Linq To Sql,Microsoft Fakes,使用,我正在进行单元测试。但我遇到了一个问题。我需要伪造一个dbml数据上下文。这是Linq到SQL类 我需要做的是伪造类System.Data.Linq.Table的InsertonSubmit0()方法。我想将要添加的param对象添加到本地字段,而不是将其写入数据库 我的问题是:如何在运行时将本地字段传输添加到现有的类表中?大概是这样的: using (ShimsContext.Create()) { var shimLinq = n

使用,我正在进行单元测试。但我遇到了一个问题。我需要伪造一个dbml数据上下文。这是Linq到SQL类

我需要做的是伪造类System.Data.Linq.Table的InsertonSubmit0()方法。我想将要添加的param对象添加到本地字段,而不是将其写入数据库

我的问题是:如何在运行时将本地字段传输添加到现有的类表中?大概是这样的:

using (ShimsContext.Create())
            {
                var shimLinq = new ShimTable<Transport>()
                {
                    //something like this:
                    //addField("transports", List<Transport>, false);
                    InsertOnSubmitT0 = (transport) =>
                    {
                        Transport t = (Transport)transport;
                    }
                };
             }
使用(ShimsContext.Create())
{
var shimLinq=新的ShimTable()
{
//大概是这样的:
//addField(“传输”,列表,假);
InsertOnSubmitT0=(传输)=>
{
运输t=(运输)运输;
}
};
}

一般来说,您无法向现有类型添加内容。(但是,您可以在运行时创建子类型并向其中添加内容)

在您的情况下,尽管我建议只使用创建垫片时捕获的常规变量,但您可以将该变量作为垫片的一部分返回,并在以后的描述中读取它

var thelist = new List<Transport>(); //fill out whatever test data you want here, in the case of TransportsGet
using (ShimsContext.Create())
  {
    var shimLinq = new ShimTable<Transport>()
    {
      InsertOnSubmitT0 = (transport) =>
      {
        Transport t = (Transport)transport;
        thelist = t.Transports; // assign your outer variable, or do the asserts directly
      }
    };
  }
// do assertions on thelist here
var thelist=newlist()//如果是TransportsGet,请在此处填写您需要的任何测试数据
使用(ShimsContext.Create())
{
var shimLinq=新的ShimTable()
{
InsertOnSubmitT0=(传输)=>
{
运输t=(运输)运输;
thelist=t.Transports;//分配外部变量,或直接进行断言
}
};
}
//在这里的列表上做断言
在您提到的填充
TransportsGet
的注释中,您可以用相同的方法执行此操作,只需返回该填充中的
list
。然后,您可以在测试结束时对列表变量进行断言


但是,如果要测试
。Where
语句,它不会直接显示在实际列表中,则必须以其他方式进行测试。您可能有一个包含无效银行的
列表
,并断言代码不返回任何内容,例如

您正在测试什么?这个值被添加到数据库中了吗?很好。我正在测试一种业务逻辑层的方法,该方法获取给定银行的所有传输。要测试:是正确的linq where语句调用。这是我所在组织中的一个单元测试示例。所以我想测试:这叫什么?-->
db.Transports.Where(t=>t.Bank.Equals(bankName)).ToList()而不是
db.Transports.ToList()?我明白了,您需要将该值存储在表对象中有什么特别的原因吗?是的,我想模拟数据访问,因为。我想在将项目插入其他方法后获取它们(我知道:),但为什么不使用单独的变量呢?为什么要把它放在表中?我现在已经做了测试,但是它抛出了一个异常,因为ShimTransportsDataContext仍然试图连接到数据库。我将尝试伪造所有建立连接的方法。或者有更好的方法吗?您可能不必伪造所有方法,只需尝试并运行,看看是否有方法尝试连接,然后伪造该方法,冲洗并重复:)