如何使用Moq存根抽象集合?

时间:2009-12-18 13:06:42

标签: c# .net unit-testing mocking moq

假设我有这门课程:

public abstract class CustomerCollectionBase : Collection<Customer>{}

我正在测试的一个类接受CustomerCollectionBase实例(它将是一些子类)。在测试方法中,通过for循环枚举此集合,并检查和处理结果。 如下:

for (int i=0;i<_customers.Count; i++){
 //process customer
}

是否可以使用Moq存储此集合,以便将存根作为依赖项传递给我的测试类的构造函数?

谢谢。

1 个答案:

答案 0 :(得分:3)

从技术上讲,这是可能的,但很困难,因为Collection<T>中唯一可覆盖的成员受到保护。

只是传递一个具体的集合会更容易,除非你绝对必须对集合本身执行一些基于交互的测试。

但是,如果您必须使用Moq执行此操作,则首先需要将以下using指令添加到测试代码中:

using Moq.Protected;

您现在可以使用Protected()方法使用CustomerCollectionBase的相应受保护虚拟方法设置模拟。

有关如何使用Moq模拟受保护成员的详细信息,请参阅this blog post