这是一个很好的测试?rspec



我是单元测试的新手,我很想提高自己。我有一个任务,我需要生成标签(一个码战数据)。

如果字符串为空或有>= 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检查字符串的长度是否为<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。因此,我已经更改了上面答案中的方法命名。

相关内容

最新更新