如何存根zendesk_api current_user获取规格?

时间:2019-02-08 18:53:59

标签: ruby-on-rails ruby rspec

我有一个模型方法,正在尝试为其编写规范。方法是这样的:

def my_method
   puts current_user.user_attirbute
end 

current_user由身份验证gem zendesk_api-1.14.4提供。为了使该方法可测试,我将其更改为:

def my_method(user_attribute = nil)
   if user_attribute = nil
      user_attribute = current_user.user_attribute
   end 
   puts user_attribute
end

此重构有效且可测试,但似乎不是一个好习惯。理想情况下,gem可以提供某种测试帮助程序来帮助对current_user进行存根/模拟,但是我什么都找不到。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以采用简单的方法,仅通过current_user#user_attribute方法测试是否返回正确的值。示例:

describe '#my_method' do 
  subject { instance.my_method } # instance is an instance of your class where #my_method is defined

  let(:user) { instance_spy(ZendeskAPI::User, user_attribute: attr) }
  let(:attr} { 'some-value' }

  before do
    allow(instance).to receive(:current_user).and_return(user)
  end 

  it { is_expected.to eq(attr) }
end

但是我会使用VCR卡带(vcr gem是here),因为它与第三方API响应有关-可以最大程度地减少误报结果的风险。下一个示例演示了记录响应的测试(仅在#current_user方法向zendesk执行请求的情况下):

describe '#my_method', vcr: { cassette_name: 'zendesk_current_user' } do 
  subject { instance.my_method } 

  it { is_expected.to eq(user_attribute_value) } # You can find the value of user_attribute_value in recorded cassette
end

P.S。我假设您将puts放入调试方法中。如果这是故意的,并且是逻辑的一部分,请在我的示例中将eq替换为output