使用MS Moles Moling DataContext?

我怎样才能扼杀我在类中使用的DataContext来将消息写入表中。 我想声明LINQ写入的表具有预期的消息计数。 这是我到目前为止所拥有的。

var context = new MJustTestingDataContext(); MyMessagewriter writer = new MyMessageWriter(context); var messageList = new List(); MTable messageTable = new MTable(); messageTable.Bind(messagesLinqList.AsQueryable()); 

如果我在测试的类中使用xUnit这个代码,我会得到这个exception

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

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

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

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

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

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

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

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

我想重定向1和3不使用数据库。 例如,我可以通过以下代码将调用重定向到SubmitChanges (3):

 bool hitSubmitChanges = false; int changeCount = 0; IList 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的值。