reactjs - 具有重复参数的 Axios 模拟适配器
问题描述
我在反应应用程序中使用模拟适配器进行测试,其中一个看起来像这样:
http://endpoint.com/api/entities?id=123&select=labels&select=versions&labelsLang=en
需要注意的重要部分是select
参数在那里两次。
其中一个测试是用另一种语言呈现,所以我们设置了两个模拟端点来反映这一点,但是我似乎找不到正确模拟重复参数的方法。我只是继续获得第一个结果。
模拟端点的代码是这样的:
const mockApiClient = axios.create({ baseURL: "http://localhost" });
const mock = new MockAdapter(mockApiClient);
const params1 = new URLSearchParams();
params1.append("id", "123");
params1.append("select", "labels");
params1.append("select", "versions");
params1.set("labelsLang", "en");
mock
.onGet("/entities", {
asymmetricMatch: function(actual: any) {
return actual.params.toString() === params1.toString();
},
})
.reply(200, getCompanyResponse);
const params2 = new URLSearchParams();
params2.append("id", "123");
params2.append("select", "labels");
params2.append("select", "versions");
params2.set("labelsLang", "de");
mock
.onGet("/entities", {
asymmetricMatch: function(actual: any) {
return actual.params.toString() === params2.toString();
},
})
.reply(200, getCompanyResponseDE);
我知道这很混乱,我只想了解如何正确执行此操作。
每当我尝试在对象中指定特定参数时,它都会抱怨您不能有重复键。
(即。
{ params:{select:'labels', select:'versions} }
)
解决方案
解决了。
这是如何完成的:
const mockApiClient = axios.create({ baseURL: "http://localhost" });
const mock = new MockAdapter(mockApiClient);
const params1 = {
"id": "123",
select: ["labels", "versions"],
"labelsLang": "en",
};
mock
.onGet("/entities", {
params: {
asymmetricMatch: function(actual: any) {
actual.sort(); // Important, as without it the order of params would affect the result
return actual.toString() === toURLSearchParams(params1).toString();
},
},
})
.reply(200, getCompanyResponse);
export const toURLSearchParams = (params: {[key: string]: string|string[]}, sort:boolean = true):URLSearchParams => {
if(params instanceof URLSearchParams) return params
const searchParams = new URLSearchParams();
for(const key in params){
const value = params[key];
if(Array.isArray(value)){
value.forEach((eachValue) => {
searchParams.append(key, eachValue)
})
} else {
searchParams.append(key,value)
}
}
if(sort) searchParams.sort() // Likewise here.
return searchParams;
}
推荐阅读
- r - 在 barCharts 上添加美学并更改 R 中的 y 轴
- reactjs - 微小警告:“未捕获的错误:模块构建失败:错误:ENOENT:没有这样的文件或目录”
- ruby-on-rails - 分页,而不是无限滚动,正在显示。如何使这段代码工作?
- python - 为什么我在 Python 上使用 If 时会出现语法错误
- c++ - 如何命中缓存?
- c++ - 带有模板基类的菱形继承:Base
- c# - 在多个组合回归模型 (ML.NET) 中将列指定为特征和标签
- python - 使用相同的 3 行代码打印多行
- firebase - 使用模拟器获取用于单元测试的 Cloud Functions url
- c - 我的程序没有按照应有的方式对齐列 [C 语言]