是否需为安全导航运算符的两种场景(对象存在/为空)编写单元测试?
安全导航运算符场景下的单元测试必要性分析
先看业务代码:
class Child belongs_to :some_parent, optional: true def status some_parent&.calculate_status end end
这段代码用了Ruby的安全导航运算符(&.),逻辑是:当some_parent存在时,返回它的calculate_status计算结果;当some_parent不存在时,返回nil。
现在的问题是:这个逻辑足够简单,是不是不用为两种场景写单元测试?还是更推荐覆盖两种场景的测试用例(如下)?
测试用例示例:
describe '#status' do context 'when some_parent does not exist' do ## 假设已通过let/before块完成场景设置 it 'returns nil' do expect(subject.status).to be nil end end context 'when some_parent exists' do ## 假设已通过let/before块完成场景设置 it 'returns the value from some_parent' do expect(subject.status).to eql('expected status') end end end
结论:更推荐编写覆盖两种场景的单元测试
原因很直接:
- 固化预期行为:哪怕逻辑简单,后续有人修改
status方法时(比如不小心把&.改成.),测试能立刻揪出问题,防止回归错误。 - 自带文档属性:测试用例能清晰告诉其他开发者这个方法的两种分支结果,不用啃代码就能明白预期,降低协作成本。
- 成本低收益高:写这两个测试的时间极少,但能提前规避很多潜在风险——比如如果后续
some_parent的关联规则被修改(比如去掉optional: true),测试也能及时暴露问题。
内容的提问来源于stack exchange,提问作者PressingOnAlways
相关产品推荐
相关产品推荐

