代码之家  ›  专栏  ›  技术社区  ›  Blake Connally

对运行时命中应用程序的API调用进行单元测试的最佳方法

  •  2
  • Blake Connally  · 技术社区  · 7 年前

    现在我们正在构建一个定制的CMS,但是我遇到了一个障碍,在那里我无法找到一个最好的方法来进行良好的单元测试。

    我们的流程如下:

    请求进入-->分析组件页-->找到组件-->点击组件API以获取组件内容

    唯一的问题是当单元测试时,我们点击应用程序的本地URL,这将不起作用,因为运行测试时应用程序没有完全运行。

    组件呈现代码:

    var componentBody = await httpClient
                .GetStringAsync("http://localhost:5001/Api/Components/" + ComponentName + "/View/" + ComponentId);
    ComponentStructure componentStructure = this.ParseHtml(componentBody);
    

    单元测试代码:

    public async Task TestPageParsing()
        {
            this.pagesClient = this.clientManager.GetClient<Page, PageData>("pages");
            var pages = await this.pagesClient.GetAsync();
            this.pageParsingService.FindComponents(pages.Items[0].Data.Text);
        }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   David Anderson    7 年前

    如果您试图测试行为而不是底层平台,那么您只需要一个单元测试。通过模拟平台依赖项(数据库、http、etcetera)并用返回硬编码事实的模拟替换它们,可以做到这一点。将平台的细节留给手动测试。如果您真的想编写一个集成测试,它仍然应该在您的测试框架中是自动化的;开发人员运行测试不需要手动设置。不过,要将它们分别分类,这样人们就可以将快速单元测试与慢速和长时间运行的集成测试分开运行。

    听起来行为才是你想要的。例如,http web api返回一个要解析的html块。在这种情况下你甚至不需要模仿,如果你只是想测试一下 ParseHtml 作品。

    var html = "<html />";
    
    var result = myObj.ParseHtml(html);
    
    // Make some assertion here
    

    您可以基于预期的html编写多个测试用例,还可以为可能格式错误的html或其他意外情况添加测试用例,以确保 解析HTML 按预期行事。

        2
  •  1
  •   Mel Gerats    7 年前

    看起来这是一个集成测试,而不是单元测试。

    您可以模拟对应用程序的调用,并为调用函数呈现一个固定的响应,然后验证它是否正确呈现。