为什么该方法不返回自定义异常消息

时间:2019-02-01 16:08:29

标签: c# unit-testing mocking moq

我希望异步方法“ 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(),然后跳转到Exception直接。该测试是使用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 :(得分:2)

您正在实例化设置中的新对象,这些对象与您在调用UpdateAsync时实例化的对象不同,因此它们将不匹配,并且Mock对象也不会引发异常。相反,如果传入正确类型的对象,则可以设置该模拟程序以引发异常,而Url参数还要检查其是否具有testUrl,例如:

com.mysql.jdbc.JDBC4PreparedStatement@414a0b8f: Select * from learners_info where lrn LIKE '%''1411237''%'