RSpec实现字符串末尾分隔符校验且不破坏原有测试用例
字符串计算器末尾分隔符校验修复方案
问题根因
原有代码未对入参末尾的分隔符做前置拦截:当字符串末尾携带逗号、空格、换行等分隔符时,split方法会自动忽略末尾的分隔符,不会生成空字符串元素,后续转整数求和逻辑会正常计算出数值,无法返回预期的错误提示。
修改逻辑
在所有入参拼接完成后、执行分割求和操作前,新增一层前置校验:如果拼接后的字符串以任意一种分隔符(逗号、空格、换行)结尾,直接返回"error";校验通过后再执行原有求和逻辑,完全不会影响已有合法场景的测试结果。
这里选择Ruby原生的end_with?方法做判断,比正则匹配可读性更高,性能也更好。
修改后可通过全部测试的完整代码
def add(*nums) joined_arguments = nums.join(",") # 新增末尾分隔符校验逻辑 return "error" if joined_arguments.end_with?(',', ' ', "\n") list_of_strings = joined_arguments.split(/[, \n]/) list_of_strings.inject(0) { |sum, num| sum + num.to_i } end RSpec.describe "string calculator" do it "returns zero when an empty string is entered" do expect(add("")).to eq(0) end it "returns one when one is entered" do expect(add("1")).to eq(1) end it "returns sum of two arguments" do expect(add("1,2")).to eq(3) end it "returns sum of two arguments that makes use of split method" do expect(add("1", "1,2")).to eq(4) end it "returns sum when split with newlines separators and comma" do expect(add("1,2\n3")).to eq(6) end it "returns an error when separator is added to end of an element" do expect(add("1,2,")).to eq("error") end end
用例验证说明
- 空字符串输入:末尾无分隔符,校验不触发,原有逻辑返回0,符合预期
- 单个数字、逗号分隔多数字、多入参、换行分隔的合法输入:末尾均为数字字符,校验不触发,求和结果和原有逻辑完全一致
- 末尾携带分隔符的非法输入:校验直接拦截返回
"error",满足规则要求
内容的提问来源于stack exchange,提问作者Adesuyi Fisola
相关产品推荐
相关产品推荐

