使用moq测试对私有方法的调用

Ray*_*Ray 8 moq

我有以下方法需要用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/

  • 我的团队决定让我将私有方法更改为受保护.然后我创建了一个包装器来测试该类.唯一困扰我的是Moq(或任何模拟框架)迫使我偏离最佳实践.我认为私人方法应该保密. (5认同)
  • Moq并没有强制偏离最佳实践,实际上偏离的是你想独立测试私有方法的事实.理想情况下,测试甚至不应该知道私有方法甚至存在.相反,您测试由您直接调用的公共方法以及之后调用的所有私有事件(即调用者看到的内容而不是实现详细信息)导致的整个交互. (3认同)

小智 3

您可以提取另一个类中的私有方法并将其公开,然后使用 Moq 模拟这些方法并验证它们是否已被调用。