6

我怎样才能摩尔我在类中使用的 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 的情况下独立使用痣。

4

2 回答 2

3

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

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

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

baseContext.Dispose = () => {};

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

于 2010-09-10T14:53:32.157 回答
0

我无法理解您的测试在做什么。我昨天不得不做类似的事情,所以我会分享我的经验。首先,重要的是要了解您不需要使用所有 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 的值。

于 2010-12-08T16:47:42.943 回答