如何对这个从api返回团队列表的C#方法进行单元测试?
我想对这个从api返回团队列表的C#方法进行单元测试?有什么帮助吗如何对这个从api返回团队列表的C#方法进行单元测试?,c#,list,unit-testing,C#,List,Unit Testing,我想对这个从api返回团队列表的C#方法进行单元测试?有什么帮助吗 public List<FootballTeam> LoadTeamStats(string seasonId) { HttpResponseMessage response = _footballApiClient.GetAsync($"{FootballApiUrls.GET_TEAMS_FOR_SEASON}/{seasonId}?api_token={ApiKeyValue}&include=
public List<FootballTeam> LoadTeamStats(string seasonId)
{
HttpResponseMessage response = _footballApiClient.GetAsync($"{FootballApiUrls.GET_TEAMS_FOR_SEASON}/{seasonId}?api_token={ApiKeyValue}&include=stats:filter(season_id|{seasonId})").Result;
if (response.IsSuccessStatusCode)
{
string teamData = response.Content.ReadAsStringAsync().Result;
var dto = JsonConvert.DeserializeObject<FootballTeamBySeasonQuery>(teamData);
return ParseTeamDetailsFromApi(dto.Teams);
}
else
{
throw new ApiException(response.ReasonPhrase);
}
}
公共列表LoadTeamStats(字符串ID)
{
HttpResponseMessageResponse={footballApiClient.GetAsync($“{FootballApiUrls.GET{TEAMS\u FOR_seasure}/{seasureId}?api_token={ApiKeyValue}&include=stats:filter(seasure|id{seasureId}”)。结果;
if(响应。IsSuccessStatusCode)
{
string teamData=response.Content.ReadAsStringAsync().Result;
var dto=JsonConvert.DeserializeObject(teamData);
返回ParseTeamDetailsFromApi(dto.Teams);
}
其他的
{
抛出新的ApiException(response.ReasonPhrase);
}
}
首先建议将此方法的关注点分开。在WebAPi控制器操作中保留所有与HTTP/REST相关的功能,但将逻辑本身提取到它们自己的类中。我通常称它们为业务服务,并将它们放入项目的非web相关程序集中(通常称为xyz.Core.dll
)
如果您不熟悉,请查看固体的形状。我学到的教训:这使单元测试逻辑(例如查询和解析)变得更容易,因为您不需要模拟/伪造HttpRequest
等。有些库也可以模拟这些东西,但它很快就会变得棘手
然后,您可以使用任何C#单元测试框架为新的
TeamDataReader
和TeamDetailsParser
类等逻辑编写测试。类似于或将在这里做得很好的框架。我还可以推荐假库和库。您可以在这里测试的一件事是LoadTeamStats
方法在响应时返回一些预期数据。IsSuccessStatusCode
为true
,否则LoadTeamStats
方法抛出ApiException
要测试它,您可以模拟\u footballpiclient
。但是正如我们所看到的,\u footballApiClient
是无法轻松模拟的HttpClient
,因此您需要将其隐藏在自己的界面后面,然后模拟它
因此,为
HttpClient
编写您自己的接口,并使用一个类似的模拟库对其进行模拟,然后编写单元测试。您正在努力解决哪一点?除了可能ParseTeamDetailsFromApi
之外,没有任何业务逻辑。是否有理由希望对控制器方法进行单元测试而不是直接进行ParseTeamDetailsFromApi
?您需要模拟外部资源,例如API
,要从DB
部分获取数据,请使用接口以抽象替换实现,关于单元测试
最重要的一点是,您需要知道要测试哪段代码。我们应该如何知道您的业务逻辑?你没有提供任何帮助。除此之外,“创建一个单元测试来验证这个方法是否按预期工作”没有神奇的按钮或脚本。相反,您应该自己思考:定义此方法的用例。这包括所有可能的输入和预期的输出。在您的情况下,您应该至少编写两个测试:一个测试response
,其中issucessstatuscode
为true,另一个测试为false。然后简单地检查返回值是否是第一种情况下的预期值,或者在后一种情况下是否抛出异常。