在课堂上有公共方法而在界面中有什么意义?

时间:2014-02-19 20:39:25

标签: c# unit-testing interface

例如:

public interface IMessageService
{
   void ProcessMessages(IEnumerable<Message> messages);
}

实现了界面:

public class MessageService : IMessageService
{
     public void ProcessMessages(IEnumerable<Message> messages)
     {
        // whatever
     }
}

然后意识到应该分解ProcessMessages以处理消息的不同部分:

public class MessageService : IMessageService
{
     public void ProcessMessages(IEnumerable<Message> messages)
     {
       foreach (var msg in messages)
       {
          ProcessCustomer(msg.Customer);
       }
     }

     private bool ProcessCustomer(Customer c)
     {

     }
}

接下来,想要对单ProcessCustomer进行单元测试ProcessCustomer public,此时如果没有强制转换,该方法无法访问,那么重点是什么?

4 个答案:

答案 0 :(得分:3)

您应该在内部使ProcessCustomer方法,然后在AssemblyInfo.cs文件中添加InternalsVisibleTo属性,以便您的单元测试程序集可以访问该方法(但不能访问任何其他程序集)。此外,您应该将MessageService类设置为内部,因此外部程序集无法访问它。这样,只有您设计的公共部分才是界面。

或者,我不是使用内部访问修饰符进行模拟,而是使用类似于此的方法:

http://exposedobject.codeplex.com/

答案 1 :(得分:3)

考虑以下内容。你去披萨店,你想测试他们的意大利辣香肠比萨饼。你想测试香肠切片机的工作原理吗?不。你想在你的披萨上看到五片意大利辣香肠 - 这是披萨店的要求。实际上,无论是手动切割香肠还是用切片机切割都没关系。您应该只验证是否正确实现了所有要求

与您的课程相同 - 它的要求是处理消息。如何实现消息的处理并不重要 - 无论是否在内部调用一些辅助方法。所以,我的建议总是一样的 - 不要测试私有方法 - 它们不是必须存在的,它们的存在不应该被测试。

答案 2 :(得分:0)

ProcessCustomer方法不是界面的一部分,因此您需要在能够使用它之前强制转换为对象类型。

如果您通过界面访问此对象类型,则需要首先转换为MessageService类型对象。

答案 3 :(得分:0)

回答问题,为什么界面中的方法不公开:

设计界面是一份契约,并隐含地公开。这是用语言设计的。因此,无需使用关键字public。