我是单元测试的新手,我很想提高自己. 我有一个任务,在那里我需要生成标签(一个代码战争形).

如果字符串为空或有>=140个字符,则需要返回FALSE. 如有必要,我将离开链接:https://www.codewars.com/kata/52449b062fb80683ec000024/train/ruby

def generateHashtag(str)
  arr = str.split.map(&:capitalize)
  arr.empty? || arr.join.length >= 140 ? false : '#' + arr.join
end

p generateHashtag(" Hello there thanks for trying my Kata") # "#HelloThereThanksForTryingMyKata"
p generateHashtag("    Hello     World   "                 ) # "#HelloWorld"
p generateHashtag(""                                       ) #  false
p generateHashtag('L' * 140) # false

代码可以工作,但我对正确编写RSpec测试很感兴趣. 我是这样写的:

require 'rspec'
require './codewars/5kyu/hashtagGenerator'

describe 'generate hashtag when string length is less that 140' do
  before :each do
    generateHashtag(" Hello there thanks for trying my Kata").length < 140
  end

  describe 'adds # to the start' do
    it 'removes one space' do
      expect(generateHashtag(" Hello there thanks for trying my Kata"))
               .to eq("#HelloThereThanksForTryingMyKata")
    end

    it 'removes more than one space' do
      expect(generateHashtag("    Hello     World   ")).to eq("#HelloWorld")
    end
  end

  describe 'empty string' do
    it 'returns false' do
      expect(generateHashtag("")).to eq(false)
    end
  end
end

describe 'more than or equal to 140 characters' do
  it 'returns false' do
    expect(generateHashtag("L" * 140)).to be(false)
  end
end

测试起作用了.但我想知道你的意见:这样可以吗?使用before判断字符串的长度是否为&lt;140,这样做正确吗?有没有其他方法可以在每一块之前判断长度?抱歉,如果这个问题听起来很愚蠢的话.我可能是设计过头了:

推荐答案

总体而言,你的规格很好.您判断了两个正常的情况,它们具有不同的空格模式,这似乎对您很重要.然后判断两个边缘情况--空的输入和太长的输入.

但我认为判断每个示例之前的输出是否少于140个字符会有什么好处.您的所有示例都有硬编码的输入和硬编码的预期输出,因此您已经知道它们都不会超过149个字符.

此外,例如,我会对规格进行一点重构,但这肯定是固执己见的:

require 'rspec'
require './codewars/5kyu/hashtagGenerator'

describe '#generate_hashtag' do
  subject(:hashtag) { generate_hashtag(input) }

  describe 'with valid input' do
    let(:input) { ' Hello there thanks for trying my Kata' }
    
    it 'returns the expected formatted output' do
      expect(hashtag).to eq('#HelloThereThanksForTryingMyKata')
    end
  end

  describe 'with input with an unusually amount of whitespace' do
    let(:input) { '    Hello     World   ' }
    
    it 'returns the expected formatted output' do
      expect(hashtag).to eq('#HelloWorld')
    end
  end

  describe 'with empty input' do
    let(:input) { '' }
    
    it 'returns false' do
      expect(hashtag).to be(false)
    end
  end

  describe 'with an input being longer than 139 chars' do
    let(:input) { "L" * 140) }
  
    it 'returns false' do
      expect(hashtag).to be(false)
    end
  end
end

吹毛求疵:Ruby对方法名的命名约定是,它们应该使用下划线而不是驼峰大小写.这意味着Ruby更喜欢generate_hashtag而不是generateHashtag.因此,我已经在上面的答案中更改了方法命名.

Ruby相关问答推荐

使用 RSpec 测试嵌套哈希时随机排序数组的匹配

为什么 ruby​​ 获得证书信任链与 gnutls-cli 不同

碰撞检测测试中对象的 Nil 类

在 ruby​​ 中提取文档中的主题标签和部分

如何判断一个对象在 Ruby 中是否可迭代?

.nil?、.blank? 之间的区别?和.empty?

查看 Savon 请求 XML 而不发送到服务器

Ruby 中的 class() 与 type()

GET 和 POST 请求的相同 Rails 4 路由

Ruby代码美化,多行拆分长指令

为什么整数除法在许多脚本语言中舍入?

需要必要的库和/或头文件时如何安装 ruby​​-debug

在 Rails 中,如何向 String 类添加新方法?

git,Heroku:预接收挂钩被拒绝

Mountain Lion rvm 安装 1.8.7 x11 错误

gem 安装失败并出现 openssl 失败

为什么在安装 gem 时出现权限被拒绝错误?

从数组 Ruby 中删除元素

你可以在Ruby中使用分号吗?

传递块时 Array#sort 如何工作?