例如:
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
,此时如果没有强制转换,该方法无法访问,那么重点是什么?
答案 0 :(得分:3)
您应该在内部使ProcessCustomer方法,然后在AssemblyInfo.cs文件中添加InternalsVisibleTo
属性,以便您的单元测试程序集可以访问该方法(但不能访问任何其他程序集)。此外,您应该将MessageService类设置为内部,因此外部程序集无法访问它。这样,只有您设计的公共部分才是界面。
或者,我不是使用内部访问修饰符进行模拟,而是使用类似于此的方法:
答案 1 :(得分:3)
考虑以下内容。你去披萨店,你想测试他们的意大利辣香肠比萨饼。你想测试香肠切片机的工作原理吗?不。你想在你的披萨上看到五片意大利辣香肠 - 这是披萨店的要求。实际上,无论是手动切割香肠还是用切片机切割都没关系。您应该只验证是否正确实现了所有要求。
与您的课程相同 - 它的要求是处理消息。如何实现消息的处理并不重要 - 无论是否在内部调用一些辅助方法。所以,我的建议总是一样的 - 不要测试私有方法 - 它们不是必须存在的,它们的存在不应该被测试。
答案 2 :(得分:0)
ProcessCustomer
方法不是界面的一部分,因此您需要在能够使用它之前强制转换为对象类型。
如果您通过界面访问此对象类型,则需要首先转换为MessageService
类型对象。
答案 3 :(得分:0)
回答问题,为什么界面中的方法不公开:
设计界面是一份契约,并隐含地公开。这是用语言设计的。因此,无需使用关键字public。