如何摧毁我在类中使用的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的情况下独立使用鼹鼠。
答案 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和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的值。