【发布时间】:2009-05-05 03:59:28
【问题描述】:
我使用 REST Starter 工具包创建了一些 POX 服务。 一开始,为服务层创建单元测试有点复杂,但最终,它设计得很好,我成功地模拟了上下文并设定了期望。
但是,我现在从客户端开始,在弄清楚如何模拟事物时遇到了一些问题。这不是那么直截了当。
所以,我有这个示例方法,它使用数据合同和 XML 作为传输通过 HTTP 发布一些数据。
public class ServiceClient: IService
{
private const string uri_template = "http://{0}:{1}/SomeService.svc/";
private readonly HttpClient http = new HttpClient();
public ServiceClient(string host, int port)
{
http.BaseAddress = new Uri(string.Format(uri_template , host, port));
}
public void Create(MyDataContract my_data_contract)
{
var content = HttpContentExtensions
.CreateDataContract(
my_data_contract,
Encoding.Default,
"text/xml",
null);
var response = http.Post("Create", content);
if (response.StatusCode != HttpStatusCode.Created) {
throw new Exception("something is not right");
}
}
}
此方法有效,并且确实可以正确发布数据和序列化。
我想做的,是对它进行单元测试。
我的问题是:
知道 HttpContextExtensions 没有实现任何接口,我如何为它制作存根/模拟?
对于 HttpClient?这是最糟糕的,因为它充满了其他地方定义的扩展方法(Post 和类似的方法都是扩展)。
在 2 中。我想我可以坚持“发送”并且它是重载的,但是与 1 中的问题相同
我想做的是为 HttpContextExtensions 和 HttpClient 提取接口,为每个子创建一个子并实现委托给父的接口,然后在我的代码中使用这些接口。
但恕我直言,这是很多工作。
我使用 RhinoMocks 作为我的模拟框架,所以我不能模拟/存根具体类,我想坚持下去,因为我真的认为模拟具体类不是很优雅。
那么,有没有像上面那样对代码进行单元测试的更清洁/更快/更智能的方法?
PD:这是用于 WCF Starter Kit 预览版 2
【问题讨论】:
-
也许我可以按照 Pablo M. Cibraro 的建议添加一些自定义阶段:weblogs.asp.net/cibrax/archive/2009/03/13/…
标签: wcf unit-testing httpclient