我想对该C#方法进行单元测试,该方法从api返回团队列表?有帮助吗?
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);
}
}
答案 0 :(得分:1)
您可以在这里测试的一件事是,LoadTeamStats
是response.IsSuccessStatusCode
时,true
方法会返回一些预期的数据,否则LoadTeamStats
方法会抛出ApiException
。
要对其进行测试,您可以模拟_footballApiClient
。但是我们看到_footballApiClient
是HttpClient
,不容易被模拟,因此您需要将其隐藏在自己的界面后面然后进行模拟。
因此,为HttpClient
编写自己的接口,并使用Moq
之类的模拟库之一对其进行模拟,然后编写单元测试。
答案 1 :(得分:0)
首先,建议将这种方法的关注点分开。将所有与HTTP / REST相关的功能保留在WebAPi控制器操作中,但将逻辑本身提取到自己的类中。我通常将其称为业务服务,并将它们放入与项目无关的程序集(通常称为xyz.Core.dll
)中。
如果您不熟悉SOLID,请查看Single responsibility principle。我吸取的教训:由于不需要模拟/伪造HttpRequest
等,这使单元测试逻辑(例如查询和解析)变得更加容易。有些库也可以模拟这些东西,但是它可以很快就会变得棘手。
然后,您可以对C#使用任何单元测试框架来编写逻辑测试,例如新的TeamDataReader
和TeamDetailsParser
类。 Nunit,XUnit或MSTest之类的框架在这里会做得很好。我还可以建议使用假库FakeItEasy和FluentAssertions库。