如何使用Moq在构造函数中使用委托测试类

时间:2014-01-06 22:44:06

标签: moq

有人可以向我解释如何在Moq TestMethod中创建此组件的实例吗?这是该类的定义。我需要测试ProcessAutomaticFillRequest方法。

public class AutomaticDispenserComponent : IAutomaticDispenserComponent
{
    private readonly Lazy<IMessageQueueComponent> _messageQueueComponent;
    protected IMessageQueueComponent MessageQueueComponent { get { return _messageQueueComponent.Value; } }

    public AutomaticDispenserComponent(Func<IMessageQueueComponent> messageQueueComponentFactory)
    {
        _messageQueueComponent = new Lazy<IMessageQueueComponent>(messageQueueComponentFactory);
    }

    public void ProcessAutomaticFillRequest(FillRequestParamDataContract fillRequestParam)
    {
        if (fillRequestParam.PrescriptionServiceUniqueId == Guid.Empty)
            throw new InvalidOperationException("No prescription service was specified for processing fill request.");

        if (fillRequestParam.Dispenser == null)
            throw new InvalidOperationException("No dispenser was specified for processing fill request.");

        var userContext = GlobalContext.CurrentUserContext;

        var channel = string.Format(Channel.FillRequest, userContext.TenantId,
            userContext.PharmacyUid, fillRequestParam.Dispenser.DeviceAgentUniqueId);

        NotificationServer.Publish(channel, fillRequestParam);
    }

以下是我开始测试的方法,但我不知道如何创建组件的实例:

[TestMethod]
    [ExpectedException(typeof (InvalidOperationException))]
    public void FillRequestFailsWhenPrescriptionServiceUniqueIdIsEmpty()
    {
        // How do I create an instance of automatiqueDispenserComponent here 
        // since there is Func as constructor parameter?

        var fillRequestParam = new FillRequestParamDataContract
        {
            PrescriptionServiceUniqueId = Guid.Empty
        };

        _automaticDispensercomponent.ProcessAutomaticFillRequest(fillRequestParam);

        // ...
    }

1 个答案:

答案 0 :(得分:1)

根据以下评论更新了答案。您需要模拟测试的Func参数。

    [TestMethod]
    [ExpectedException(typeof(InvalidOperationException))]
    public void FillRequestFailsWhenPrescriptionServiceUniqueIdIsEmpty()
    {
        var mockMsgQueueComponent = new Mock<Func<IMessageQueueComponent>>();

        var _automaticDispensercomponent = new AutomaticDispenserComponent
            (mockMsgQueueComponent.Object);

        var fillRequestParam = new FillRequestParamDataContract
        {
            PrescriptionServiceUniqueId = Guid.Empty
        };

        _automaticDispensercomponent.ProcessAutomaticFillRequest(fillRequestParam);
    }