我们有一个mockdatacontext来进行一些单元测试.
在测试时,我们发现了两种不同的行为,具体取决于是使用“真实”还是“模拟”数据库.
场景1:真实数据库
数据库中有5条记录:
db = realDatabasedb.InsertOnsubmit(new record)var count1 = db.gettable.Count()db.submitChanges()var count2 = db.gettable.Count()
count1 = 5
count2 = 6
场景2:模拟数据库
数据库中有5条记录:
db= mockDatabasedb.InsertOnsubmit(new record)var count1 = db.gettable.Count()db.submitChanges()var count2 = db.gettable.Count()
count1 = 6
count2 = 6
*“模拟”数据库在调用submitChanges()之前已经知道新记录,因此它包含在计数中.为了测试,我们需要两个行为相同.
有没有其他人遇到这个问题,你能建议一个解决方案吗?
解决方法 IMO,一个人试图在测试中模拟的常见错误.模拟不是模拟器.它不应该实现类似于原始的逻辑,它应该只返回硬编码结果.如果模拟行为很复杂,您最终会测试模拟而不是业务代码.
我正在使用RhinoMocks,它看起来像这样:
// arrangeIList<Record> testdata = new List<Record>() {a,b,c};db = MockRepository.GenerateMock<IDatabase>();db.Stub(x => db.gettable).Return(testdata);// act: call your unit under test// assertdb.AssertWasCalled(x => x.InsertOnsubmit(Arg<Record>.Is.Anything));db.AssertWasCalled(x => x.submitChanges());
它每次仍返回相同的列表.在许多情况下,这就足够了.您仍然可以在第二个gettable调用上返回其他数据:
db.Stub(x => db.gettable).Return(testdata1);db.Stub(x => db.gettable).Return(testdata2);
它总是特定于单个测试,但这使它变得如此简单.
编辑:
我不得不承认我不熟悉linq2sql.在我的例子中被模拟的调用是linq2sql调用,这可能不容易被嘲笑.您可能需要将其置于简单的DAL界面之后.然后你模拟这个界面.
总结以上是内存溢出为你收集整理的c# – “模拟”数据库和“真实”数据库行为之间的差异全部内容,希望文章能够帮你解决c# – “模拟”数据库和“真实”数据库行为之间的差异所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)