子类化和扩展 Promise for Jest 模拟
Subclassing and extending Promise for Jest mock
我正在使用模块 rn-fetch-blob
来管理 React-Native 项目中的下载。该模块提供了一个 StatefulPromise
class ,这基本上是一个带有一些附加功能的承诺。这个添加的功能给我的 Jest 单元测试带来了问题。这是最初导致问题的模拟(文件 __mocks__/rn-fetch-blob.js
中的代码):
export default {
config: jest.fn(x => {
return {
fetch: jest.fn(x => Promise.resolve({ // <- I believe the problem lies here
info: () => {
return {status: 200}
}
}))
}
})
}
我在代码中的某处引用了一种 StatefulPromise 方法 (expire
)。涵盖该方法的单元测试失败并显示以下消息:
filePromise.expire is not a function
.
我的想法是创建自己的StatefulPromise
为了测试:
class StatefulPromise extends Promise {
expire() {
jest.fn(() => {})
}
}
...
...
...
fetch: jest.fn(x => StatefulPromise.resolve({<same logic as before>});
这并没有解决问题。
我会注意到这在我的浏览器 javascript 控制台中似乎工作得很好。以下内容也让我感到惊讶:
let foo = StatefulPromise.resolve('foo');
console.log(foo instanceof StatefulPromise);
// true in console; false in jest
这让我很困惑。有没有更好的方法来解决这个问题?
如果 class 继承出错,StatefulPromise.resolve('foo') instanceof StatefulPromise
可能为假。如果它在某些环境中工作但在 Jest 中不工作,这可能意味着 Jest 没有正确配置,并且 class 继承在不应该受到 Babel 的影响时受到影响。这不一定是本次测试的问题,但以后可能会成为问题。
rn-fetch-blob
doesn't provide custom methods with inheritance。即使可以,这通常也不会强制要求在测试中复制 class 层次结构。如源代码中所建议的那样,无需在随时间变化的测试中使用第三方 StatefulPromise
。由于 promise 应该表现得像 ES6 promise,因此可以对其进行模拟并在需要时进行扩充。
是:
fetch: jest.fn(x => Object.assign(
Promise.resolve(...),
{ extend: jest.fn() }
)
我正在使用模块 rn-fetch-blob
来管理 React-Native 项目中的下载。该模块提供了一个 StatefulPromise
class ,这基本上是一个带有一些附加功能的承诺。这个添加的功能给我的 Jest 单元测试带来了问题。这是最初导致问题的模拟(文件 __mocks__/rn-fetch-blob.js
中的代码):
export default {
config: jest.fn(x => {
return {
fetch: jest.fn(x => Promise.resolve({ // <- I believe the problem lies here
info: () => {
return {status: 200}
}
}))
}
})
}
我在代码中的某处引用了一种 StatefulPromise 方法 (expire
)。涵盖该方法的单元测试失败并显示以下消息:
filePromise.expire is not a function
.
我的想法是创建自己的StatefulPromise
为了测试:
class StatefulPromise extends Promise {
expire() {
jest.fn(() => {})
}
}
...
...
...
fetch: jest.fn(x => StatefulPromise.resolve({<same logic as before>});
这并没有解决问题。
我会注意到这在我的浏览器 javascript 控制台中似乎工作得很好。以下内容也让我感到惊讶:
let foo = StatefulPromise.resolve('foo');
console.log(foo instanceof StatefulPromise);
// true in console; false in jest
这让我很困惑。有没有更好的方法来解决这个问题?
StatefulPromise.resolve('foo') instanceof StatefulPromise
可能为假。如果它在某些环境中工作但在 Jest 中不工作,这可能意味着 Jest 没有正确配置,并且 class 继承在不应该受到 Babel 的影响时受到影响。这不一定是本次测试的问题,但以后可能会成为问题。
rn-fetch-blob
doesn't provide custom methods with inheritance。即使可以,这通常也不会强制要求在测试中复制 class 层次结构。如源代码中所建议的那样,无需在随时间变化的测试中使用第三方 StatefulPromise
。由于 promise 应该表现得像 ES6 promise,因此可以对其进行模拟并在需要时进行扩充。
是:
fetch: jest.fn(x => Object.assign(
Promise.resolve(...),
{ extend: jest.fn() }
)