我有以下方法需要用Moq测试.问题是switch语句中调用的每个方法都是私有的,包括最后的PublishMessage.但是这种方法(ProcessMessage)是公开的.我如何测试这个,以便我可以确保根据参数进行调用?请注意,我没有测试私有方法,我只想测试"调用".我想模拟这些私有方法,并检查它们是否使用安装程序调用,但Moq不支持模拟私有方法.
public void ProcessMessage(DispenserMessageDataContract dispenserMessage)
{
var transOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, transOptions))
{
switch (dispenserMessage.Type)
{
case DispenserMessageType.AckNack:
UpdateAckNackMessageQueue(dispenserMessage);
break;
case DispenserMessageType.FillRequest:
CreateFillRequestMessageQueue(dispenserMessage);
break;
case DispenserMessageType.FillEvent:
UpdateFillEventMessageQueue(dispenserMessage);
break;
case DispenserMessageType.RequestInventory:
CreateRequestInventoryMessageQueue(dispenserMessage);
break;
case DispenserMessageType.ReceiveInventory:
CreateReceiveInventoryMessageQueue(dispenserMessage);
break;
}
scope.Complete();
}
PublishMessage(dispenserMessage);
}
Run Code Online (Sandbox Code Playgroud)
Ada*_*hah 10
您将不得不将这些私有方法更改为至少受保护的虚拟模拟它们,然后使用mock.Protected来模拟它们(http://blogs.clariusconsulting.net/kzu/mocking-protected-members-with-moq/).你不能模仿私人方法.
Moq(以及其他一些框架)使用Castle Project的DynamicProxy在运行时动态生成代理,以便可以截获对象的成员而无需修改类的代码.该拦截只能在公共虚拟和受保护的虚拟方法上完成.
有关更多信息,请参阅以下URL:http: //www.castleproject.org/projects/dynamicproxy/