2013-10-11 18 views
0

使用Microsoft Fakes Framework,我正在进行单元测试。但是我遇到了一个问题。我需要伪造一个dbml DataContext。这是Linq to SQL类。在运行时添加字段 - Microsoft Fakes Framework

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

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

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

你在测试什么?该值被添加到数据库? – aL3891

+0

好的。我正在测试一种业务逻辑层的方法,该方法可以为一个给定的银行获取所有的传输。测试:是声明调用的正确的linq。这是我组织中的单元测试示例。所以我想测试一下:这个叫吗? - >'db.Transports.Where(t => t.Bank.Equals(bankName))。ToList();'而不是'db.Transports.ToList();'? – dpwulp94

+0

我明白了,是否有特殊原因需要将该值存储在Table对象中? – aL3891

回答

1

一般来说,你不能添加一些东西到现有的类型。 (然而,你可以在运行时创建一个子类型并添加东西)

在你的情况下,虽然我建议只使用你创建垫片时捕获的常规变量,然后你可以返回该变量作为你的垫片的一部分在您的descresion

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与无效的银行和断言,代码不会返回任何例如

+0

我现在已经做了测试,但它会抛出异常,因为ShimTransportsDataContext仍会尝试连接到数据库。我将尝试伪造所有连接的方法。或者,还有更好的方法? – dpwulp94

+0

你可能不必假装他们所有的人,只是尝试和运行,看看一个方法试图连接,然后假冒该方法,冲洗并重复:) – aL3891

相关问题