【发布时间】:2020-01-10 00:47:19
【问题描述】:
我有以下从端点检索数据的控制器。
它还可以根据是否设置type对数据进行排序。
最好的测试方法是什么?
public class UsersController : ControllerBase
{
[HttpGet]
public async Task<IActionResult> GetAllUsers(string type)
{
using (var client = new HttpClient())
{
try
{
client.BaseAddress = new Uri("http://demo10102020.mockable.io");
var response = await client.GetAsync($"/people");
response.EnsureSuccessStatusCode();
var stringResult = await response.Content.ReadAsStringAsync();
List<User> rawUsers = JsonConvert.DeserializeObject<User[]>(stringResult).ToList();
List<User> sortedUsers = rawUsers;
if(type == "first-name")
{
sortedUsers = rawUsers.OrderBy(o => o.FirstName).ToList();
}
else if(type == "score")
{
sortedUsers = rawUsers.OrderBy(o => o.Score).ToList();
}
return Ok(sortedUsers);
}
catch (HttpRequestException httpRequestException)
{
return BadRequest($"Error getting users: {httpRequestException.Message}");
}
}
}
}
这是我目前的方法,我不确定如何模拟 API:
[TestClass]
public class TestPersonController
{
[TestMethod]
public void GetAllPersons_ShouldReturnAllProducts()
{
var testPersons = GetTestPersons();
var controller = new PersonController();
}
private List<Person> GetTestPersons()
{
var testPersons = new List<Person>();
testPersons.Add(new Person { FirstName = "dfdfdf", Surname = "dfdfdf", Score = 100 });
testPersons.Add(new Person { FirstName = "dfsdfsfasf", Surname = "safasfsdaf", Score = 200 });
testPersons.Add(new Person { FirstName = "asffas", Surname = "asdffasdf", Score = 200 });
return testPersons;
}
}
【问题讨论】:
-
您当前(尚未显示)的方法有什么问题?
-
我假设您使用的是 Newtonsoft JSON 库?只是好奇您没有收到
DeserializeObject方法可能引发不会在HttpRequestException块中捕获的异常的预编译警告。--抱歉,这不能回答您的问题 -
就您的测试用例而言,将方法
GetAllUsers分成两种方法会更容易——一种处理GetAsync。然后将响应字符串传递给另一个方法进行反序列化。此外,一般建议在方法执行异步操作的任何方法名称中包含“异步”,例如GetAllUsersAsync() -
它也可以排序 SRP 的反例。应该从方法中提取逻辑,以便抽象出与第三方的通信。这样你就可以毫无问题地测试排序逻辑。是否可以选择重构被测代码?
标签: c#