【问题标题】:Moling DataContext with MS Moles?用 MS Moles 摩尔 DataContext?
【发布时间】:2011-04-10 18:41:52
【问题描述】:

如何使用我在类中使用的 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.

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

【问题讨论】:

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


    【解决方案1】:

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

    1. 从数据库中获取要修改的用户列表
    2. 修改集合中的每个用户
    3. 将新集发送回数据库

    我想重定向 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 的值。

    【讨论】:

    • 其他注意事项:此处使用的 MDataContext 需要为 System.Data.Linq 创建一个 Mole。
    【解决方案2】:

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

    要实现mole,您可以执行context.Dispose = () =&gt; {};,这意味着当在mole 实例上调用Dispose 方法时不会发生任何事情。 我重读了这个问题,您可能遇到了问题,因为Dispose 是在基类中定义的。要使用摩尔基础方法,您需要执行以下操作:

    var context = new MJustTestingDataContext();
    var baseContext = new MDataContext(context);
    
    baseContext.Dispose = () => {};
    

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

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      相关资源
      最近更新 更多