2

我正在使用 FtpWebRequest 和瞬态故障处理应用程序块。对于我的故障处理程序,我有一个错误检测策略来检查响应是否被认为是瞬态的,以便它知道是否重试:

public bool IsTransient(Exception ex)
    {

        var isTransient = false;
        //will be false if the exception is not a web exception.
        var webEx = ex as WebException;

        //happens when receiving a protocol error.
        //This protocol error wraps the inner exception, e.g. a 401 access denied.
        if (webEx != null && webEx.Status == WebExceptionStatus.ProtocolError)
        {
            var response = webEx.Response as FtpWebResponse;
            if (response != null && (int)response.StatusCode < 400)
            {
                isTransient = true;
            }
        }
        // if it is a web exception but not a protocol error,
        // check the status code.
        else if (webEx != null)
        {
            //(check for transient error statuses here...)
            isTransient = true;
        }

        return isTransient;
    }

我正在尝试编写一些测试来检查是否将适当的错误标记为瞬态,但是我在创建或模拟具有 FtpWebResponse 内部异常的 Web 异常时遇到了麻烦(因此下面的响应不是t 始终为空)

var response = webEx.Response as FtpWebResponse;

有人知道我该怎么做吗?我会以正确的方式去做吗?

4

2 回答 2

2

使用适当的构造函数WebException来设置响应:

public WebException(
 string message,
 Exception innerException,
 WebExceptionStatus status,
 WebResponse response)

使用 FtpWebResponse 设置异常是我遇到的问题...... FtpWebResponse 有一个我无法访问的内部构造函数。

BCL 并不是真正为测试而设计的,因为该概念在编写时并不大。您必须使用反射调用该内部构造函数(使用反编译器查看可用的内容)。或者,使用自定义可模拟类包装您需要的所有 System.Net 类。不过,这看起来工作量很大。

于 2014-07-17T11:20:54.457 回答
0

我使用由 Rhino Framework 创建的 FtpWebResponse 存根构建我的离线测试

例子:

public WebException createExceptionHelper(String message, WebExceptionStatus webExceptionStatus, FtpStatusCode serverError )
{
    var ftpWebResponse = Rhino.Mocks.MockRepository.GenerateStub<FtpWebResponse>();
    ftpWebResponse.Stub(f => f.StatusCode).Return(serverError);
    ftpWebResponse.Stub(f => f.ResponseUri).Return(new Uri("http://mock.localhost"));

    //now just pass the ftpWebResponse stub object to the constructor
    return new WebException(message, null, webExceptionStatus, ftpWebResponse);
    }
于 2018-02-28T18:36:48.130 回答