我有一个模型方法,正在尝试为其编写规范。方法是这样的:
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
进行存根/模拟,但是我什么都找不到。有什么建议吗?
答案 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
。