这是我的RSpec测试代码:
describe SmoothPayApi do
before :all do
@item = SmoothPayApi.new
@token = ''
end
describe "#getToken" do
it "gets token" do
VCR.use_cassette 'api/getToken' do
return_info = @item.getToken('X3r82l89', 1)
expect(return_info.success).to eq('success')
$token = return_info.data
end
end
end
describe "#pay" do
it "gets a response from pay" do
VCR.use_cassette 'api/pay' do
return_info = @item.pay($token, '30', [{"id" => 1, "name" => 'margherita', "price" => 9.99, "quantity" => 1, "category" => 'pizzas', "code" => 'abcd'}, {"id" => 2, "name" => 'alex', "price" => 7.99, "quantity" => 3, "category" => 'pizzas', "code" => 'abcd'}])
expect(return_info.message).to eq('30')
end
end
end
end
在第二个it
示例中,我需要使用第一个$token
示例中评估的it
值。但是$token
在第二个示例中无法正常工作。我怎样才能做到这一点?我尝试使用let
,但我不能这样做。
答案 0 :(得分:1)
$token
无效,因为您的意思是@token
。但这对您没有多大帮助,因为当您自己运行第二个测试时,@token
为空,但 pay 方法需要有效的令牌。
所以规则是:不要让你的测试相互依赖!首先,你应该始终能够对它进行单一测试。然后,如果测试失败,则应始终在此测试本身中找到根本原因,而不是在其他测试中。最后,您可以按随机顺序运行测试(以查找相互依赖的测试的问题)。然后,永远不能保证您的令牌创建测试将在使用它之前运行。
所以永远不要使用全局变量,也避免在测试中使用实例变量。最好使用let
。
您可以将令牌创建作为辅助函数,并在需要令牌时调用它。但问题是:你真的需要吗?最好重新安排一些事情(如果您的api调用有副作用,可以通过使用存根来实现),这样您就可以为 pay 方法指定一个任意标记。您使用VCR存根请求,因此您指定所有数据并且您知道令牌。那么为什么不在let
?