【发布时间】:2017-01-05 10:52:46
【问题描述】:
对不起,如果我的问题让任何人感到困惑,我正在努力使场景清晰。
我正在为调用 HttpClient 方法的方法编写测试用例。所以,我最终编写了以下测试方法。
[TestMethod]
public async Task CallComplexRefTypeParamAPI_Get_GetResponseWithParamatersNameValueAppended()
{
#region Arrange
//var resourceURL = @"http://localhost:32662/api/user/ComplexReferenceTypeParamStringResponse";
var resourceURL = @"/api/user/ComplexReferenceTypeParamStringResponse";
var restHelper = new RestHelper(_BaseAddress);
string ParameterKey1 = "VariableStr";
string ParameterValueStr = "Jia";
string ParameterKey2 = "VariableInt";
int ParameterValueInt = 1;
string ParameterKey3 = "VariableBool";
bool ParameterValueBool = true;
string ParameterKey4 = "VariableDateTime";
DateTime ParameterValueDateTime = DateTime.Now;
ComplexRefType ParameterComplexRefType = new ComplexRefType()
{
VariableBool = ParameterValueBool,
VariableDateTime = ParameterValueDateTime,
VariableInt = ParameterValueInt,
VariableStr = ParameterValueStr
};
string result;
#endregion
#region Act
using (WebApp.Start<WebApiStartup>(_BaseAddress))
{
restHelper.AddURLParameters("VariableComplexRef", ParameterComplexRefType);
restHelper.AddURLParameters("DummyStr", "DummyStr");
result = await restHelper.ExecuteAsync<string>(HttpMethod.Get, resourceURL);
}
#endregion
#region Assert
Assert.AreEqual<string>(string.Format("{0}={1}&{2}={3}&{4}={5}&{6}={7}",
ParameterKey1, ParameterValueStr,
ParameterKey2, ParameterValueInt,
ParameterKey3, ParameterValueBool,
ParameterKey4, ParameterValueDateTime), result);
#endregion
}
另一方面,我的测试控制器有以下两种方法。
public string GetMultipleTypeParamStringResponse(string VariableStr, int VariableInt, DateTime VariableDateTime)
{
return string.Format("VariableStr={0}&VariableInt={1}&VariableDateTime={2}", VariableStr, VariableInt, VariableDateTime);
}
public string GetComplexReferenceTypeParamStringResponse([FromUri]ComplexRefType VariableComplexRef, string DummyStr)
{
return string.Format("VariableStr={0}&VariableInt={1}&VariableBool={2}&VariableDateTime={3}",
VariableComplexRef.VariableStr,
VariableComplexRef.VariableInt,
VariableComplexRef.VariableBool,
VariableComplexRef.VariableDateTime);
}
我在 Web API 应用程序中复制了相同的控制器。如果运行指向自托管 API 的测试方法,应用程序会点击“GetMultipleTypeParamStringResponse”而不是“GetComplexReferenceTypeParamStringResponse”。但是,如果我针对 Web API 运行它,它会命中正确的“GetComplexReferenceTypeParamStringResponse”方法。
有人可以帮我理解为什么会出现这种行为吗?在这两种情况下,生成的查询字符串看起来都很相似。
自托管 http://localhost:8888/api/user/ComplexReferenceTypeParamStringResponse?VariableStr=Jia&VariableInt=1&VariableBool=True&VariableDateTime=1%2F5%2F2017 3:49:10 PM&DummyStr=DummyStr
网络 API http://localhost:32662/api/user/ComplexReferenceTypeParamStringResponse?VariableStr=Jia&VariableInt=1&VariableBool=True&VariableDateTime=1%2F5%2F2017 3:50:58 PM&DummyStr=DummyStr
【问题讨论】:
-
您可以尝试将显式 [Route("api/user/ComplexReferenceTypeParamStringResponse")] 属性添加到您的测试控制器方法中。
-
试过了,但这并没有太大帮助。它仍然以相同的方式运行
-
您能否也发布您在测试 api 应用程序中的路由配置?
-
' public void Configuration(IAppBuilder appBuilder) { // 为自托管配置 Web API。 HttpConfiguration 配置 = 新的 HttpConfiguration(); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); appBuilder.UseWebApi(config); }'
-
您可以尝试更改路由配置中的 routeTemplate: "api/{controller}/{action}/{id}" 并包含上一条评论中提到的 Route 属性(同时标记使用 [HttpGet] 显式方法
标签: c# asp.net-web-api