Как смоделировать объект MQ-Series MQQueueManager с помощью MOQ для .NET? - PullRequest
1 голос
/ 01 декабря 2010

Я пытаюсь выполнить модульное тестирование реализации моего проекта в серии MQ, и мне нужно смоделировать соединение с сервером серии MQ, чтобы протестировать мою реализацию изолированно и избежать отправки / получения сообщений из реальной очереди.

Вот код:

using IBM.WMQ;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace Test
{
    [TestClass]
    public class MQTest
    {
        [TestMethod]
        public void SendMessage_MoqUnitTest()
        {
            //create a mock MQ manager
            var mqManMock = new Mock<MQQueueManager>();

            //test by calling the send method
            MyMQhandler.MQSender mqsender = new MyMQhandler.MQSender();
            //error happens when trying to access the moq object here
            mqsender.Send("test message", mqManMock.Object); 
        }
    }
}

Мне известно, что я еще не настраивал moq, но проблема возникает еще до того, как какой-либо код будет запущен против него.

Проблема в том, что когда я делаю это, я получаю исключение. Трассировка стека из внутреннего исключения с сообщением «Произошла ошибка ввода-вывода»:

в IBM.WMQ.MQChannelTable.CreateChannelEntryLists (MQChannelListEntry nameList) в IBM.WMQ.Nmqi.ManagedNmqiMQ.CreateNameListEntryFromCCDT (String qMgrName, String ccdtFile) в IBM.WMQ.Nmqi.ManagedNmqiMQ.CreateNameListEntryFromCCDT (String qMgrName) в IBM.WMQ.Nmqi.ManagedNmqiMQ.GetNameList (String qMgrName) в IBM.WMQ.Nmqi.ManagedNmqiMQ.DoConn (строка qMgrName, MQConnectOptions cno, ManagedHconn manHconn, Int32 и hConn, Int32 и compCode, Int32 и причина) в IBM.WMQ.Nmqi.ManagedNmqiMQ.MQCONNX (строка pQMgrName, MQConnectOptions pConnectOpts, Phconn phconn, Int32 & pCompCode, Int32 & pReason) в IBM.WMQ.MQQueueManager.Connect (String queueManagerName) в IBM.WMQ.MQQueueManager..ctor () at Castle.Proxies.MQQueueManagerProxy..ctor (IInterceptor [])

Большую часть времени я запускаю его, хотя просто получаю «Тайм-аут оценки функции» или объект MQManMock.Object.

Значит ли это, что я не могу издеваться над MQ ??

1 Ответ

1 голос
/ 01 декабря 2010

Похоже, что вы на самом деле нажимаете MQQueueManager.

Для этого вам нужно поместить MQQueueManager за свой собственный интерфейс (при условии, что сам класс уже не реализует интерфейс) и использовать Mock для его создания.интерфейс.

, поэтому создайте IMQQueueManager с методом send и в своей реализации фактически выполняйте работу с MQQueueManager, и ваши потребительские классы должны затем передавать этот интерфейс в них, как правило, через конструктор, чтобы использовать MQQueueManager.

, чтобы вы могли написать реализацию, подобную этой

public interface IMQQueueManager 
{
    void Send(string message, MQManMock obj);
}

public interface ConcreteMQQueueManager : IMQQueueManager
{
    public void Send(string message, MQManMock obj)
    {
        //create a mock MQ manager
            var MQManMock = new MQQueueManager();

            //test by calling the send method
            MyMQhandler.MQSender mqsender = new MyMQhandler.MQSender();
            //error happens when trying to access the moq object here
            mqsender.Send("test message", MQManMock.Object); 
    }
}

, тогда вы будете писать свои модульные тесты для класса ниже

public class myclass
{

    IMQQueueManager _manager
    public myclass(IMQQueueManager queueManager)
    {
        _manager = queueManager;
    }

    public void AddItemToQueue(string MyItem)
    {

        _manager.Send("Hello",MQManMock.Object);
    }

}

И использовать Moq для проверки этой отправкибыл назван

...