![](/img/trans.png)
[英]Unit testing an AuthorizeAttribute on an ASP.NET Core MVC API controller
[英]Unit testing MVC Controller making calls to a static library calling external API
美好的一天,
我对以下单元测试感到困惑:
1. MVC控制器:
[HttpGet]
public async Task<PartialViewResult> DoExternalCallsAsync()
{
var model = new MyModel();
await MyStaticLibrary.DoExternalWorkAsync(Server.MapPath("~\\") + "WorkSource.txt", model);
return PartialView("_MyResults", model);
}
2.静态库:
public static async Task DoExternalWorkAsync(string sourcePath, MyModel model)
{
var externalCalls =
System.IO.File.ReadAllLines(sourcePath)
.Where(line => (!string.IsNullOrEmpty(line) && line.First() != '#'))
.Select(p => DoExternalCall(p, model));
await Task.WhenAll(externalCalls);
}
private static async Task DoExternalCall(string urlPath, MyModel model)
{
var result = await GetExternalApiResultAysnc(urlPath);
// some code here...
return;
}
基本上,控制器所做的只是调用一个外部API,该API会执行一些工作并返回结果或引发错误。
外部Api 没有接口或抽象类 。
我该如何进行单元测试? 注意:我不能随意更改外部Api的设计。
谢谢,
在代码中使用静态类或方法会使该代码难以正确进行单元测试。 请参阅“对于单元测试而言,static是否普遍“邪恶””,如果是,为什么reshaper推荐它? , 单元测试中的静态类/方法/属性,是否停止 , 何时在C#中使用静态类 。
使用接口将静态API调用类包装为实例类:
public interface IMyLibrary
{
Task DoExternalWorkAsync();
}
public class MyStaticLibrary : IMyLibrary
{
public async Task DoExternalWorkAsync(string sourcePath, MyModel model)
{
return await MyStaticLibrary.DoExternalWorkAsync(sourcePath, model);
}
}
然后,您可以将实例注入控制器的构造函数中 。
因为在此控制器操作方法中应该进行单元测试的唯一原因是:
在测试过程中,您可以在控制器中注入IMyLibrary
并验证控制器正确调用了该模拟,并且可以验证结果是否为PartialViewResult
包含其应包含的内容。
该库是执行某些工作单元的实现细节 。 它应该被完全抽象出来。 如果要运行集成测试 ,则完全是另一种测试风格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.