我有一个 Storybook我需要让我的 React 组件的子组件停止执行 API 调用的设置。设置非常复杂,而且与问题无关,所以我只说我需要组件停止执行 API 调用。
我的最终目标是让子组件永远处于“加载状态”,因此 模拟服务器响应不是这里的解决方案。
我想出的方法是用 stub 的 Thunk Action 创建器替换我的 Thunk Action 创建器。类似于我们在 Jest 单元测试中所做的
// note that I'm using redux ducks: https://github.com/erikras/ducks-modular-redux
jest.mock('./ducks/students');
当然,上面的方法是行不通的,因为 Storybook 不能在 Jest 上运行。所以我目前的方法是使用 NormalModuleReplacementPlugin将真正的模块 ducks/students.js 替换为包含函数但主体为空的 stub ducks/stubs/students.js:
// ./ducks/students.js
export const loadResources() = fetch('/resources');
export default (state, actions => {
// reducer's body
}
// ./ducks/stubs/students.js
export const loadResources() = Promise.resolve(); // STUBBED
export default (state, actions => {
// reducer's body
}
问题是我只需要对 thunk Action 创建者进行 stub ,文件中的其他所有内容(其他 Action 和 reducer)都需要相同。
这是我迄今为止考虑过的解决此问题的方法:
require.requireActual()。原来这是一个 Jest 自定义函数,所以我不能在 Storybook 上使用它。理想情况下,我可以找到一种方法将实际模块中的所有内容导入 stub 模块,并导出 stub 函数和我需要的其余实际函数。
当我使用 NormalModuleReplacementPlugin 时,有什么想法可以从 stub 模块访问实际模块吗?
Tarun 关于仅模拟获取函数并返回 new Promise() 的建议适用于“无限期加载”的特殊情况。
但是,纵观全局,我仍然宁愿将所有 API 调用 stub ,这样我就可以通过修改 redux 状态来设置故事。
“但是你为什么不能直接模拟 JSON 响应呢?”我听到你问。 JSON 响应不一定是与应用程序域模型的一对一映射。我们有负责转换的映射器函数。
如果程序员可以仅使用领域模型知识来工作和设置测试用例,而不需要知道服务器响应 JSON 结构,我会更好。不用说,app redux store 结构就是领域模型。
所以我仍然需要一个关于在使用 NormalModuleReplacementPlugin 时如何从实际文件中请求的答案。
最佳答案
我还没有对此进行测试,但您可以通过聚合/重新导出模块语法并覆盖您的 loadResources() 函数来实现您想要的。
为此,将您的实际模块导入 ./ducks/stubs/students.js,从该模块导出所有内容,然后定义/覆盖 loadResources() 和也导出它。然后,您可以像往常一样使用 NormalModuleReplacementPlugin 并将您的 stub 文件作为 newResource 传递,该文件将包含您希望与 thunk 一起保留的所有实际模块缩减器/操作覆盖并删除:
//ducks.stubs.students.js
export * from './ducks/students.js';
//override students.loadResources() with our stub
//order matters as the override must come after
//the export statement above
export const loadResources() = //some stubbed behavior;
//webpack.config.js
module.exports = {
plugins: [
new webpack.NormalModuleReplacementPlugin(
/ducks\.students\.js/,
'./ducks.stubs.students.js'
)
]
}
关于此解决方案的一些注意事项/注意事项/陷阱:
let 与const(没什么大不了的)export * from 表达式不应处理 default 导出。因此,您可能必须添加 export { default } from './ducks/students.js';。当然,请记住,您将无法导出 stub 文件的 native 默认函数(当然,除非您使用 stub 覆盖原始 default 函数)。关于javascript - 使用 NormalModuleReplacementPlugin 从实际文件中获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56795008/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题