Модульное тестирование ServiceBus.Message.Как установить значение для SystemProperties.LockToken? - PullRequest
1 голос
/ 23 мая 2019

Я хочу проверить обратный вызов обработчика сообщений, который я зарегистрировал в QueueClient, используя queueClient.RegisterMessageHandler(MyCallBack, messageHandlerOptions).

public Task MyCallBack(Message msg, CancellationToken token)
{
   // Read msg. Do something

   // Since everything ran fine, complete the msg.
   await _client.CompleteAsync(msg.SystemProperties.LockToken);
}

Теперь в рамках моего модульного теста я звоню MyCallBack. Поскольку я передаю действительное сообщение. Я ожидаю, что client.CompleteAsync() будет вызван. Однако тест выдает исключение.

System.InvalidOperationException: Operation is not valid due to the current state of the object.

Это потому, что msg.SystemProperties.LockToken не установлен , а не установлен (это потому, что сообщение не было на самом деле прочитано из очереди клиентом в режиме ReceiveMode.PeekLock).

Есть ли способ установить / смоделировать это, чтобы я мог выполнять свои тесты с фиктивной строкой в ​​качестве токена?


PS: я знаю, что могу проверить msg.SystemProperties.IsLockTokenSet перед тем, как получить доступ к полю LockToken; но даже в этом случае я никогда не смогу провести модульное тестирование, если был вызван _client.CompleteAsync().

1 Ответ

0 голосов
/ 22 июля 2019

Я создал метод-обертку GetLockToken(), который возвращает строку LockToken, если она установлена ​​в сообщении, иначе он возвращает ноль (вместо выдачи исключения).

private string GetLockToken(Message msg)
{
    // msg.SystemProperties.LockToken Get property throws exception if not set. Return null instead.
    return msg.SystemProperties.IsLockTokenSet ? msg.SystemProperties.LockToken : null;
}

Исходный вызов методаCompleteAsync() теперь изменено на:

await _client.CompleteAsync(GetLockToken(message));

Примечание : указанное выше изменение не меняет ожидаемого поведения!В производственном сценарии вызов CompleteAsync(null) все равно вызовет исключение :) (по желанию).

С учетом вышеуказанных изменений теперь я могу настроить свои макеты следующим образом:

var mock= new Mock<IQueueClient>();
mock.Setup(c => c.CompleteAsync(/*lockToken*/ null))
               .Returns(Task.CompletedTask);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...