Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对这个从api返回团队列表的C#方法进行单元测试?_C#_List_Unit Testing - Fatal编程技术网

如何对这个从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=

我想对这个从api返回团队列表的C#方法进行单元测试?有什么帮助吗

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。然后简单地检查返回值是否是第一种情况下的预期值,或者在后一种情况下是否抛出异常。