英文:
How would I mock out Meteor.settings with jest?
问题
Meteor.settings 在一个我正在尝试模拟的 React 类组件中被使用。在该组件的构造函数中,会访问 Meteor.settings 来获取一个 URL。我正在使用 jest 中的 moduleMapper 来模拟 Meteor.settings,如下所示:
const Meteor = {
settings: {
public: {
URL: "http://testing:0000",
},
},
};
export default Meteor;
在我的测试文件中,我导入了我的类组件。运行 jest 后,我收到以下错误消息:
TypeError: Cannot read property 'settings' of undefined
据我理解,问题在于 Meteor 没有正确被模拟。
我该如何解决这个问题,以便我可以在我的组件中使用 Meteor.settings 的模拟?
英文:
Meteor.settings is being used in a react class component that I am trying to mock. In the constructor of that component, Meteor.settings is accessed to get a url. I am using the moduleMapper from jest to mock Meteor.settings like so:
const Meteor = {
settings: {
public: {
URL: "http://testing:0000",
},
},
};
export default Meteor;
In my test file I am importing my class component. After running jest, I am getting the following error:
TypeError: Cannot read property 'settings' of undefined
.
To my understanding, the issue is that Meteor is not correctly being mocked.
How can I fix this issue, so that I can use a mock of Meteor.settings in my component?
答案1
得分: 0
我替换了每个 Meteor 实例,用(((Meteor || {}).settings || {}).public || {})
代替,在一个单独的文件中模拟 Meteor。对于你的情况,只需在 Meteor 字典的每个级别包含一个空字典。
英文:
Instead of mocking Meteor out in a separate file, I replaced each instance of Meteor with (((Meteor || {}).settings || {}).public || {})
For your case just include an empty dictionary w/ each level of the meteor dictionary.
答案2
得分: 0
- 根据存储库README中的说明,包括
meteor-jest-stubs
。 - 通过在
__mocks__/meteor/meteor.js
中包含一个文件来模拟Meteor模块的缺失/自定义部分。
import { Meteor as MockedMongo } from "meteor/meteor"
export const Meteor = {
...MockedMongo,
// 然后模拟其他Meteor值,例如:
absoluteUrl: jest.fn().mockReturnValue("http://localhost:3000/"),
settings: {
public: {
URL: "http://testing:0000",
},
private: {
MY_PRIVATE_KEY: "secret"
}
},
subscribe: jest.fn().mockImplementation(() => ({
ready: jest.fn().mockReturnValue(true),
stop: jest.fn()
})),
// 等等。
}
然后jest会自动检测__mocks__
目录,并在您的测试中模拟Meteor值。
https://jestjs.io/docs/manual-mocks#mocking-user-modules
英文:
I do this exact thing!
- Include
meteor-jest-stubs
per the instructions in the repo README. - Stub out missing/custom pieces by including a file at
__mocks__/meteor/meteor.js
to mock the Meteor module.
import { Meteor as MockedMongo } from "meteor/meteor"
export const Meteor = {
...MockedMongo,
// then stub out any other meteor values, for example:
absoluteUrl: jest.fn().mockReturnValue("http://localhost:3000/"),
settings: {
public: {
URL: "http://testing:0000",
},
private: {
MY_PRIVATE_KEY: "secret"
}
},
subscribe: jest.fn().mockImplementation(() => ({
ready: jest.fn().mockReturnValue(true),
stop: jest.fn()
})),
// etc.
}
Then jest picks up on the __mocks__
directory automatically and will mock out the Meteor value in your tests.
https://jestjs.io/docs/manual-mocks#mocking-user-modules
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论