uni-app uts 遵守协议无效,要怎么处理

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app uts 遵守协议无效,要怎么处理

uts 写iOS端http请求使用URLSessionDelegate 复写的协议方法不生效,这个要怎么办?

class MySessionDelegate implements URLSessionDelegate {  
    urlSession(_: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: (disposition?: URLSession.AuthChallengeDisposition, credential?: URLCredential) => void) {  
        console.log("challenge-->", challenge);  
        if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {  
            completionHandler(URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))  
        } else {  
            completionHandler(URLSession.AuthChallengeDisposition.performDefaultHandling, null)  
        }  
    }  
}  

export const hkRequest: MyApi = function (params: MyApiOptions) {  
    const options: MyApiOptionsType = params.options  
    console.log("options-->", options);  
    const url = new URL(options.url!)  
    const request: URLRequest = new URLRequest(url: url)  
    request.httpMethod = options.method  
    if (options.method != 'GET') {  
        try {  
            request.httpBody = UTSiOS.try(JSONSerialization.data(withJSONObject: options.data, options: []))  
        } catch (e) {  
            //TODO handle the exception  
            params.fail?.(e)  
            return  
        }  
    }  
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")  
    const session = new URLSession(configuration: URLSessionConfiguration.default, delegate: new MySessionDelegate(), delegateQueue: null)  
    try {  
        const task = session.dataTask(with: request, completionHandler: (data?: Data, response?: URLResponse, error?: any) => {  
            console.log("response-->", response);  
            console.log("data-->", data);  
            console.log("error-->", JSON.stringify(error));  
            if (response == null) {  
                params.fail?.('请求异常')  
                return  
            }  
            params.complete?.(response)  
            if (error != null && data != null) {  
                params.fail?.(error)  
                return  
            }  
            console.log("data-->", data);  
            try {  
                const result = UTSiOS.try(JSONSerialization.jsonObject(with: data!))  
                params.success?.(result)  
            } catch (e) {  
                //TODO handle the exception  
                params.fail?.(e)  
                return  
            }  

        })  
        // 启动请求  
        task.resume()  
    } catch (e) {  
        //TODO handle the exception  
        console.log("e-->", e);  
    }  
}

1 回复

针对您提到的uni-app中UTS(Uni Test Suite,即uni-app的测试框架)遵守协议无效的问题,通常可能涉及到测试配置、网络请求拦截或模拟、协议实现等多个方面。以下是一些可能的解决方案,主要以代码示例的形式展现,帮助您定位并解决问题。

1. 检查并更新UTS配置

首先,确保您的UTS配置是正确的。在uni.jsonmanifest.json中,检查是否有针对UTS的特殊配置,并确保它们符合最新的uni-app文档要求。

// manifest.json 示例
{
  "uni-app": {
    "scripts": {
      "test": "cross-env NODE_ENV=test jest --config ./tests/jest.config.js"
    }
  }
}

2. 使用Mock服务模拟网络请求

如果UTS不遵守协议是因为网络请求的问题,您可以考虑使用Mock服务来模拟这些请求。在Jest测试中,您可以利用jest.mock来模拟依赖的模块,包括网络请求库。

// mocks/axios.js
const axios = jest.genMockFromModule('axios');

axios.get.mockImplementation((url) => {
  return Promise.resolve({ data: { message: 'Mocked Response' } });
});

module.exports = axios;

// 在测试文件中
jest.mock('axios', require.resolve('./mocks/axios'));

import axios from 'axios';

test('fetch data from mock server', async () => {
  const response = await axios.get('https://api.example.com/data');
  expect(response.data.message).toBe('Mocked Response');
});

3. 确保协议实现正确

如果UTS不遵守的协议是自定义的或特定于应用的,您需要确保在测试环境中也实现了这些协议。这可能涉及到设置正确的请求头、处理特定的响应格式等。

// 示例:设置请求头
axios.get('https://api.example.com/data', {
  headers: {
    'Custom-Header': 'CustomValue'
  }
});

// 示例:验证响应格式
test('response format', async () => {
  const response = await axios.get('https://api.example.com/data');
  expect(typeof response.data).toBe('object');
  expect(response.data.hasOwnProperty('expectedKey')).toBe(true);
});

结论

以上代码示例展示了如何在uni-app的UTS中处理可能的协议遵守问题。请根据您的具体情况调整这些示例,确保它们符合您的项目需求。如果问题依旧存在,建议检查uni-app和UTS的官方文档,或寻求社区的帮助。

回到顶部