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

时间:2013-10-11 08:13:43

标签: c# linq unit-testing linq-to-sql microsoft-fakes

使用Microsoft Fakes Framework,我正在开展单元测试。但是我遇到了一个问题。我需要伪造一个dbml DataContext。这是Linq to SQL类。

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

我的问题是:如何在运行时在现有类表上添加本地字段 Transports ?像这样:

using (ShimsContext.Create())
            {
                var shimLinq = new ShimTable<Transport>()
                {
                    //something like this:
                    //addField("transports", List<Transport>, false);
                    InsertOnSubmitT0 = (transport) =>
                    {
                        Transport t = (Transport)transport;
                    }
                };
             }

1 个答案:

答案 0 :(得分:1)

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

在你的情况下,虽然我建议你只使用你在创建垫片时捕获的常规变量,然后可以将该变量作为垫片的一部分返回,并在稍后的描述中阅读

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

在您提到的评论TransportsGet中,您可以采用相同的方式执行此操作,只需在该垫片中返回thelist即可。然后,您可以在测试结束时对thelist变量执行断言。

但是,如果你想测试一个.Where语句,它不会直接显示在实际列表中,你必须以其他方式测试它。你可能有一个thelist无效的银行,并断言代码没有返回任何东西,例如