[英]What is wrong in this c# code for simple RestApi?
我收到反馈:
“代码测试未达到预期水平,缺乏对异步、HTTP 客户端以及一般软件开发模式的理解。结构和测试不佳”
简单的测试和解决方案在 GitHub https://github.com/sasa-yovanovicc/weatherapi
我真的很感激任何有助于理解问题所在的帮助,因为代码有效,测试有效,并且涵盖所有解决方案,老实说,我不知道他们期望什么。
我知道在 OOP 中代码可以更抽象和更复杂,但我看不出使代码比解决给定问题所需的更复杂的任何目的。
可以做的改进很少,不仅会遵循现代实践,而且在某些情况下会简化代码:
使用IHttpClientFactory
(以前根据请求实例化HttpClient
被认为是一种不好的做法 - 请参阅此处和此处为什么,尽管现在情况有所改善,但也请参阅此)。 有关可能的使用模式,请查看文档
使用强类型配置,例如使用选项模式
实际上没有理由在您的代码中使用GetAwaiter().GetResult()
,例如在WeatherController
中:
if (response.IsSuccessStatusCode) { var weatherResponse = response.Content.ReadFromJsonAsync<WeatherResponse>().GetAwaiter().GetResult();
在我看来,可以在这方面改进代码:
这段代码应该放在Service层。 这段代码放在AstronomyController
HttpClient httpClient = new(); var responseAstro = await httpClient.GetAsync(requestURIAstro);
通常,控制器不应该有任何逻辑。 它应该协调和编排服务。
如果这个Helper
class 有StringHelper
名称,它将更具可读性:
public class StringHelper
因此可以得出结论,如果StringHelper
的代码片段将包含有助于使用int
类型的代码,那么它将违反SOLID 原则的单一责任原则。
使用GetResult()
可能是死锁的潜在原因
var r = response.Content.ReadFromJsonAsync<ErrorResponse>().GetAwaiter().GetResult();
所以最好使用await
:
var r = await response.Content.ReadFromJsonAsync<ErrorResponse>(); // the other code is omitted for the brevity
最好按三重 A 模式编写测试。 此外,在为控制器编写代码时,尽量使用抽象。 在此处阅读有关如何测试控制器的更多信息
例如:
public class HomeController: Controller { private readonly IBrainstormSessionRepository _sessionRepository; // the other code is omitted for the brevity
这里IBrainstormSessionRepository
是一个抽象。 此外,阅读这篇文章“ Unit testing best practices with .NET Core and .NET Standard ”非常有帮助。
测试中应避免使用多个Assert
。 Roy Osherove 的“The Art of Unit Testing”有一本非常好的书。 Osherove 警告的事情之一是单元测试中的多个断言。 也就是说,人们通常应该避免编写可能因不止一种原因而失败的测试。
例如,这里应该只有一个Assert
:
Assert.NotNull(result); Assert.IsType<ObjectResult>(result); var objectResult = result as ObjectResult; Assert.NotNull(objectResult); var model = objectResult.Value as InfoMessage; Assert.NotNull(model);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.