使用MS Moles Moling DataContext?

时间:2010-09-10 14:48:52

标签: c# mocking pex-and-moles moles

如何摧毁我在类中使用的DataContext来将消息写入表中。我想声明LINQ写入的表具有预期的消息计数。这是我到目前为止所拥有的。

var context = new MJustTestingDataContext();
MyMessagewriter writer = new MyMessageWriter(context);

var messageList = new List<MIncmoingMessage>();
MTable<MIncomingMessage> messageTable = new MTable<MIncomingMessage>();
messageTable.Bind(messagesLinqList.AsQueryable());

如果我在测试的类中使用xUnit的代码,我将得到此异常

Microsoft.Moles.Framework.Moles.MoleNotImplementedException: DataContext.Dispose() was not moled.

我在这里缺少什么以及如何在mole上实现DataContext.Dispose()?我在没有Pex的情况下独立使用鼹鼠。

2 个答案:

答案 0 :(得分:3)

当你创建一个新的Mole时,它的方法和属性的默认行为是在调用它们时抛出MoleNotImplementedException

要实现鼹鼠,你可以context.Dispose = () => {};,这意味着在moled实例上调用Dispose方法时没有任何反应。 我重读了这个问题,你可能遇到了问题,因为在基类中定义了Dispose。要使用基本方法,您需要执行以下操作:

var context = new MJustTestingDataContext();
var baseContext = new MDataContext(context);

baseContext.Dispose = () => {};

您需要实现被测试代码调用的每个属性/方法,或者您可以使用方法BehaveAsDefaultValue全局设置mole实例的默认行为。这样,在mole中的每个方法都不会执行任何操作,并返回其返回类型的默认值(如果存在而不是抛出MoleNotImplementedException)。但是,如果你需要这种行为,最好使用存根而不是痣。

答案 1 :(得分:0)

我无法理解您的测试正在做什么。昨天我不得不做类似的事情,所以我会分享我的经验。首先,重要的是要了解您不需要使用所有MoleType来测试代码 - 您只需要使用Moles将代码的某些部分重定向到lambda表达式。给定一种方法:

  1. 获取要从数据库修改的用户列表
  2. 修改集合中的每个用户
  3. 将新集发送回数据库
  4. 我想重定向1和3以不使用数据库。例如,我可以通过以下代码将调用重定向到SubmitChanges(3):

    bool hitSubmitChanges = false;
    int changeCount = 0;
    IList<object> updates = null;
    
    // more code here... 
    
       // redirect DataContext.SubmitChanges() to a lambda to catch updates 
       MDataContext.AllInstances.SubmitChanges = (c) =>
       {
        changeCount = c.GetChangeSet().Updates.Count;
        updates = c.GetChangeSet().Updates;
        hitSubmitChanges = true;
       };
    

    那个(以及获取用户的调用)将是我在测试中使用的唯一Moletypes。剩下的就是正常的。然后我可以使用断言来检查changeCount,updates和hitSubmitChanges的值。