使用前面示例中修改的变量

时间:2014-07-24 09:21:27

标签: ruby rspec

这是我的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,但我不能这样做。

1 个答案:

答案 0 :(得分:1)

$token无效,因为您的意思是@token。但这对您没有多大帮助,因为当您自己运行第二个测试时,@token为空,但 pay 方法需要有效的令牌。

所以规则是:不要让你的测试相互依赖!首先,你应该始终能够对它进行单一测试。然后,如果测试失败,则应始终在此测试本身中找到根本原因,而不是在其他测试中。最后,您可以按随机顺序运行测试(以查找相互依赖的测试的问题)。然后,永远不能保证您的令牌创建测试将在使用它之前运行。

所以永远不要使用全局变量,也避免在测试中使用实例变量。最好使用let

您可以将令牌创建作为辅助函数,并在需要令牌时调用它。但问题是:你真的需要吗?最好重新安排一些事情(如果您的api调用有副作用,可以通过使用存根来实现),这样您就可以为 pay 方法指定一个任意标记。您使用VCR存根请求,因此指定所有数据并且您知道令牌。那么为什么不在let

中明确设置令牌呢?