如何使用ServiceStack测试WebServiceException处理?

时间:2014-01-08 19:50:41

标签: c# web-services rest servicestack moq

我有一个控制器方法,如:

public class FooController : Controller {

    private IApi api;

    public FooController(IApi api) { 
        this.api = api;
    }

    public ActionResult Index() {
        try {
            var data = api.GetSomeData();
            return(View(data));
        } catch(WebServiceException wsx) {
            if(wsx.StatusCode == 409) return(View("Conflict", wsx));
            throw;
        }
    }
}

API实例是ServiceStack JsonClient的包装器,我的ServiceStack服务上有方法会抛出409个冲突,如:

throw HttpError.Conflict(StatusMessages.USERNAME_NOT_AVAILABLE);

在我的单元测试中,我正在使用Moq来模拟IApi,但我无法弄清楚如何“模拟”远程服务器返回409时JsonClient抛出的WebServiceException。我的单元测试代码如下所示:

var mockApi = new Mock<IApi>();
var ex = HttpError.Conflict(StatusMessages.USERNAME_NOT_AVAILABLE);
var wsx = new WebServiceException(ex.Message, ex);
wsx.StatusCode = (int)HttpStatusCode.Conflict;
wsx.StatusDescription = ex.Message;

mockApi.Setup(api => api.GetSomeData()).Throws(wsx);

var c = new FooController(mockApi.Object);
var result = c.Index() as ViewResult;
result.ShouldNotBe(null);
result.ViewName.ShouldBe("Conflict");

但是,有几个字段 - ErrorMessageErrorCodeResponseStatus - 这些字段是只读的,因此无法在我的单元测试中设置。

当客户端从服务器收到HTTP错误响应时,如何让ServiceStack在单元测试中抛出相同的WebServiceException?

1 个答案:

答案 0 :(得分:1)

查看WebServiceException的{​​{3}},ErrorMessageErrorCodeResponseStatus似乎是从ResponseDto中提取的,公开可设定的。

看起来有一个CreateResponseStatus(string errorCode, string errorMessage, IEnumerable<ValidationErrorField> validationErrors)方法source code可以帮助创建它吗?