繁体   English   中英

单元测试MVC Controller调用调用外部API的静态库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM