模拟 API 响应时如何在单元测试中使用 JSON 文件

Posted

技术标签:

【中文标题】模拟 API 响应时如何在单元测试中使用 JSON 文件【英文标题】:How can I use a JSON file within a Unit Test when mocking an API response 【发布时间】:2019-01-26 09:28:22 【问题描述】:

我想加载一个 JSON 文件并将其转换为数据作为我的单元测试的一部分。

这样我可以断言我的服务如何处理响应,但是我不想用大量的 json 块填充每个测试用例。我希望将文件保存在与测试用例相同的目录中,但是尝试运行测试会引发异常,因为找不到文件。

   func test_ViewDidLoad_CallsContentService() 
        let contentExpectation = expectation(description: "FetchContentEntry")
        let httpClient = HTTPClient()
        let response = createURLResponse(forUrl: "https://foo.bar", withStatusCode: 200)
        httpClient.session = MockURLSession(data: mockContentData, urlResponse: response, error: nil)

.....

我的文件被引用为

extension ContentSceneTests 

   .........

    var mockContentData: Data 
        let data = try! Data(contentsOf: URL(fileURLWithPath: "./ContentResponse.json"), options: .alwaysMapped)
        return data
    

文件彼此相邻,例如

ContentSceneTests.swift

内容响应.json

【问题讨论】:

能否捕获异常(找不到文件)并打印当前目录是什么? 【参考方案1】:

我在测试中使用XCTestCase 的扩展名做了类似的事情。

你应该可以使用

var mockContentData: Data 
    return getData(name: "ContentResponse")


func getData(name: String, withExtension: String = "json") -> Data 
    let bundle = Bundle(for: type(of: self))
    let fileUrl = bundle.url(forResource: name, withExtension: withExtension)
    let data = try! Data(contentsOf: fileUrl!)
    return data

【讨论】:

以上是关于模拟 API 响应时如何在单元测试中使用 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring 在单元测试中模拟远程 REST API?

在 Angular 11 中进行单元测试时,将 json 对象转换为 typescript 接口导致模拟对象出错

Laravel 尝试对 API JSON 响应进行单元测试

Angular 6 - 如何在单元测试中模拟 router.events url 响应

如何在带有 Jest 的 react-native 中使用模拟的 fetch() 对 API 调用进行单元测试

单元测试:如何在流明中模拟具有路由参数的请求