测试 Rspec + FactoryGirl + i18n=cn + model.valid? == false 的时候如何给出明确的 cn 提示

chuanjiabao · 2013年03月26日 · 最后由 nightire 回复于 2013年03月26日 · 2539 次阅读

在使用 FactoryGirl4.04 + Rspec 对 model 进行测试的时候,config.i18n.default_locale = :cn,对于如下的 case

before {@user = FactoryGirl.create(:user)}
subject {@user}
it {should be_valid}

如果测试失败的时候给出提示太少了,很难定位问题。 查阅了一些资料,进行了改进,具体流程请看这里: https://www.evernote.com/shard/s56/sh/63d724a8-813c-4255-83fc-ce9d9c1e3501/4ef336af827345c0cfedd1dba133c964

object.errors.message == I18n.t('what_you_specify_in_yml_file')

#1 楼 @nightire 中文化已经做了。 关键是如下 case: model 有 10 个字段,其中 8 个不符合 valid 的。如果不加优化,在 local=cn 仅会有提示此 model 不合法,不会给出那 8 个字段出错,哪些出错;但是在 local=en 的模式下会给出哪些字段出错,什么地方错了。

这个是 factory girl 的问题。

#2 楼 @chuanjiabao 不清楚,我用 FG 的时候没有遇到过你说的问题,所有的字段验证错误都会在测试中报出来,只要你中文化里有对应的条目,就可以用 I18n.t 调用出来进行断言。

#3 楼 @nightire 是不是和版本有关。我用的 4.04。

#4 楼 @chuanjiabao 你可以试下呗,在测试中的任意位置打印一个 I18n 出来,条目就是你对某一个字段验证的反馈信息,跑一下测试看有输出不?如果有输出那必然就可以用来做断言的呀。

#5 楼 @nightire 可能是我表述的问题,我和你说的不是同一件事。我说的是对于这样一个 case it {should be_valid} 如果没有通过,应该自动告诉我 model 中哪个字段错误了,不要自己在写代码了输出这些错误了

#6 楼 @chuanjiabao 那就是了,你这个算是一个新需求,be_valid 方法只是告诉你是不是 valid,而不负责具体的 error.message,rails 显示最终的错误上页面的时候还有额外的工作,不是一个 be_valid 就可以全部覆盖的,它只是一个验证触发机制。所以你要这么改也没有问题,我只是觉得如果有必要去测试更细粒度的部分,就不应该回避写更细测试的过程,否则的话测试本身是具有一定“欺骗性”的,因为你获得的信息依赖的不是测试代码本身,而是你的 hack。我想 FG 的开发者应该不会不知道这一点,现在的结果应该是权衡之后的选择。

#7 楼 @nightire >>>想 FG 的开发者应该不会不知道这一点,现在的结果应该是权衡之后的选择。 这个观点我不认同。 首先,在 en 模式下,fg 就会把所有的信息都输出出来,为什么在 cn 模式下就要"权衡"呢? 其次,case 没通过,给出明确的信息应该是友好的,和”更细力度的测试“没啥关系吧。

#8 楼 @chuanjiabao 哦,英文下是都输出的,那我还真不清楚,我只是猜测罢了,因为我向来都是直接开始 I18n,很少直接工作在英语的语言环境下。因为我觉得 I18n 的测试都 OK 的话,英文也不会有什么问题。也正因为如此,我都是直接对单独的每一条验证进行测试的,我所谓的更细的粒度就是说的这个,因为我一开始就这么做,所以没觉得有什么不应该。不过你这么一说,那应该是 FG 没有测试其在多语言环境下的兼容性,或许你可以提交一个 Issue 给他们呢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号