我是单元测试的新手,我很想提高自己。我有一个任务,我需要生成标签(一个码战数据)。
如果字符串为空或有>= 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
。因此,我已经更改了上面答案中的方法命名。