2013-07-02 84 views
0

我已经创建了一个自定义的相等比较器,并针对比较器运行了相应的测试。如何模拟CustomEqualityComparer

现在我试图嘲笑它,以便使用比较器测试的类不必传递真实的东西。

我的方法调用看起来像:

left.Except(right, customEqualityComparer); 

当变量“左”和“右”是任何类型的两个列表和customEqualityComparer是我的自定义相等比较。

我的问题是,我不知道如何模拟customEqualityComparer,因为它仍然以现实的方式行事。

我正在考虑创建一个包含该方法的类:

public List<object> LeftExceptRight(customEqualityComparer, left, right){} 

而嘲讽的整个方法。这是否过分矫枉过正?我看不到任何其他的替代品..

+0

说你的比较器是'CustomComparer',你的类是否有直接的依赖关系(即调用'new CustomComparer()')或者通过接口获得它('IComparer ')? –

回答

1

这是矫枉过正?

听起来像是给我的。为什么你想嘲笑你的比较器呢?它是否在测试方面做了特别困难的事情,例如使用外部Web服务或数据库? (这将是不寻常的。)

只要你的比较器也在本身进行了彻底的测试,我发现在测试中将它用于现实中的任何事情都没有问题。实际上,嘲笑它没有任何显着的好处 - 事实恰恰相反。当你在你的测试中使用它时,你将会有效地测试调用代码和比较器之间的集成,以及它们一起工作,而不仅仅是一个。

我知道有些人坚持认为单元测试确实需要一次只测试一个类的代码......但实用主义让我相信,虽然嘲笑在许多情况下非常有价值,但很容易过度使用它 - 而仅仅使用真正实现的简单方法往往是要走的路。

+0

CustomEqualityComparer将只用于left.except(右),right.except(左)和list1.Intersect(list2)。如果我要为构造函数中的CustomEqualityComparer的3个方法创建包装类,您认为它会保证它是自己的测试吗?这样整个模块将完全可插拔。 – SamuelDavis

+1

@SamuelDavis:我敢说 - 但这并不意味着你不能在其他班级的考试中使用它。你认为你从嘲笑中得到什么好处? –

+0

对不起,意外按下'输入',而只输入了我的评论的一半。你能否重读我的最初答复?如果我有一个测试过的'自定义列表扩展'类,它可以在更多的项目中使用。 – SamuelDavis