如何对该C#方法进行单元测试,该方法从api返回团队列表?

时间:2018-07-10 06:51:31

标签: c# list unit-testing

我想对该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);
    }
}

2 个答案:

答案 0 :(得分:1)

您可以在这里测试的一件事是,LoadTeamStatsresponse.IsSuccessStatusCode时,true方法会返回一些预期的数据,否则LoadTeamStats方法会抛出ApiException

要对其进行测试,您可以模拟_footballApiClient。但是我们看到_footballApiClientHttpClient,不容易被模拟,因此您需要将其隐藏在自己的界面后面然后进行模拟。

因此,为HttpClient编写自己的接口,并使用Moq之类的模拟库之一对其进行模拟,然后编写单元测试。

答案 1 :(得分:0)

首先,建议将这种方法的关注点分开。将所有与HTTP / REST相关的功能保留在WebAPi控制器操作中,但将逻辑本身提取到自己的类中。我通常将其称为业务服务,并将它们放入与项目无关的程序集(通常称为xyz.Core.dll)中。

如果您不熟悉SOLID,请查看Single responsibility principle。我吸取的教训:由于不需要模拟/伪造HttpRequest等,这使单元测试逻辑(例如查询和解析)变得更加容易。有些库也可以模拟这些东西,但是它可以很快就会变得棘手。

然后,您可以对C#使用任何单元测试框架来编写逻辑测试,例如新的TeamDataReaderTeamDetailsParser类。 NunitXUnitMSTest之类的框架在这​​里会做得很好。我还可以建议使用假库FakeItEasyFluentAssertions库。