我有一个控制器方法,如:
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");
但是,有几个字段 - ErrorMessage
,ErrorCode
,ResponseStatus
- 这些字段是只读的,因此无法在我的单元测试中设置。
当客户端从服务器收到HTTP错误响应时,如何让ServiceStack在单元测试中抛出相同的WebServiceException?
答案 0 :(得分:1)
查看WebServiceException
的{{3}},ErrorMessage
,ErrorCode
和ResponseStatus
似乎是从ResponseDto
中提取的,公开可设定的。
看起来有一个CreateResponseStatus(string errorCode, string errorMessage, IEnumerable<ValidationErrorField> validationErrors)
方法source code可以帮助创建它吗?