最近开始尝试 RSpec(以前只用过 Cucumber)测试真实项目(以前都是看教程玩玩的),有时候有多个测试用例,仅仅测试数据不同,而测试的代码是相同的,如何做到象 Cucumber 一样的共享测试代码? 我现在大概只能想到用这种土办法:
describe ... do
context ... do
def test_code(p1, p2, p3)
...
end
it '...' do
d1 = ...; d2 = ...; d3 = ...
test_code(d1, d2, d3)
end
it '...' do
d1 = ...; d2 = ...; d3 = ...
test_code(d1, d2, d3)
end
end
end
这样的测试代码显然丑爆了,请问大家应该怎么写才对?谢谢
为什么呢?难道分开放就难读难维护了吗?那你为什么不把测试代码和应用代码放在一起呢?把所有的代码都放在一起就好了。 helper 就是让你更好维护的,职责分开了
#5 楼 @woaigithub 我还是不能接受测试代码不在测试用例的文件里而是在一个 helper 里,在我看来,helper 应该是存放一些比较低层而且比较抽象的函数库的。
引号里的代表了你的测试思路。知道了你的思路可以帮你看怎么写合适。
真实代码不方便可以改变下比如用 posts, comments 一类的,只要是同样意思就好。
找到了这样一个办法
describe ... do
context ... do
shared_examples ... do
it ... do
...
end
end
context ... do
include_examples ... do
let(:d1){...}
let(:d2){...}
let(:d3){...}
end
end
context ... do
include_examples ... do
let(:d1){...}
let(:d2){...}
let(:d3){...}
end
end
end
end
虽然还是没有完全达到预期,但是已经好多了
这种可以考虑用 should_receive, 我来帮你举个例子,比如说 gem 是 一个加法器,你的包装是把参数绝对值之后在传入加法器。
你可以写成
it "should pass the positives through"
Adder.should_receive( :add).with(1,2,3)
AbsoluteAdder.add(1,2,3)
end
it "should negate the nagatives"
Adder.should_receive( :add).with(1,2,3)
AbsoluteAdder.add(1,-2, -3)
end