Почему метод не возвращает пользовательское сообщение об исключении - PullRequest
0 голосов
/ 01 февраля 2019

Я бы хотел, чтобы асинхронный метод "UpdateAsync" возвращал пользовательское сообщение об исключении при вызове метода PutAsync.Теперь я делаю макет класса, к которому принадлежат PutAsync, а затем я настраиваю метод и даю параметр.Я также использую Throws для пользовательских сообщений об исключениях.

Проблема в том, что когда я запускаю этот

var result = await this.repository.UpdateAsync(new EndPoint(new Uri(testUrl), HttpMethod.Put), JObject.FromObject(new object()), this.exceptionProcessor);

, PutAsync продолжает работать без исключений возврата.Вот код.

Mock<RestClient> rc = new Mock<RestClient>();
rc.Setup(x => x.PutAsync(new Uri(testUrl), JObject.FromObject(new object()), new NameValueCollection()))
.Throws(new Exception("TestMessage"));

var result = await this.repository.UpdateAsync(new EndPoint(new Uri(testUrl), HttpMethod.Put), JObject.FromObject(new object()), this.exceptionProcessor);
Assert.IsTrue(result.ErrorMessages.GetValue(string.Empty).Equals("TestMessage"));

здесь - основная часть UpdateAsync, когда процесс переходит сюда, он сначала войдет в GetClient (), а затем сразу перейдет к исключению.Этот тест был написан с использованием Shimes, но мы больше не хотим использовать Shimes, поэтому мне нужно использовать другой способ.

public virtual async Task<GenericOperationResult<object>> UpdateAsync(EndPoint endpoint, JContainer obj, IExceptionProcessor exceptionProcessor, NameValueCollection headers){

     if (endpoint.ActionMethod == HttpMethod.Put)
     {
        result = await this.GetClient().PutAsync(endpoint.Url, obj, headers);
     }
     else if (endpoint.ActionMethod == HttpMethod.Post)
     {
        result = await this.GetClient().PostAsync(endpoint.Url, obj, headers);
     }
     else
     {
        throw new ConfigurationException("Update supports only POST or PUT verbs. Check endpoint configuration.");
     }
     return new GenericOperationResult<object>(200, result); 
}

1 Ответ

0 голосов
/ 01 февраля 2019

Вы создаете новые объекты в вашей настройке, которые отличаются от объектов, которые вы создаете при вызове UpdateAsync, поэтому они не будут совпадать, и объект Mock не будет выдавать исключение.Вместо этого вы можете настроить макет на выдачу исключения, если переданы объекты правильных типов, при этом параметр Url также проверяет, имеет ли он testUrl, например:

rc.Setup(x => x.PutAsync(It.Is<Uri>(u => u.OriginalString == testUrl), It.IsAny<JObject>(), It.IsAny<NameValueCollection>())
    .ThrowsAsync(new Exception("TestMessage"));
...