gpt4 book ai didi

ruby-on-rails - 重构 Rspec 规范

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:07 25 4
gpt4 key购买 nike

我正在尝试清理我的规范,因为它们变得非常重复。

我有以下规范

  describe "Countries API" do 
it "should render a country list" do
co1 = Factory(:country)
co2 = Factory(:country)
result = invoke :GetCountryList, "empty_auth"

result.should be_an_instance_of(Api::GetCountryListReply)
result.status.should be_an_instance_of(Api::SoapStatus)
result.status.code.should eql 0
result.status.errors.should be_an_instance_of Array
result.status.errors.length.should eql 0
result.country_list.should be_an_instance_of Array
result.country_list.first.should be_an_instance_of(Api::Country)
result.country_list.should have(2).items
end
it_should_behave_like "All Web Services"
it "should render a non-zero status for an invalid request"
end

检查状态的代码块将出现在我的 50-60 个 API 的所有规范中。我的第一个想法是将其移至一种方法,而重构肯定会使事情变得更加枯燥,如下所示:-

def status_should_be_valid(status)
status.should be_an_instance_of(Api::SoapStatus)
status.code.should eql 0
status.errors.should be_an_instance_of Array
status.errors.length.should eql 0
end

describe "Countries API" do
it "should render a country list" do
co1 = Factory(:country)
co2 = Factory(:country)
result = invoke :GetCountryList, "empty_auth"

result.should be_an_instance_of(Api::GetCountryListReply)
status_should_be_valid(result.status)
result.country_list.should be_an_instance_of Array
result.country_list.first.should be_an_instance_of(Api::Country)
result.country_list.should have(2).items
end
end

这行得通,但是我不禁觉得这不是“正确”的方法,我应该使用共享规范,但是查看定义共享规范的方法我无法轻易看出我将如何重构它使用共享规范的示例。

我如何使用共享规范来做到这一点,而不必在开始时重新运行相对昂贵的 block

  co1 = Factory(:country)
co2 = Factory(:country)
result = invoke :GetCountryList, "empty_auth"

最佳答案

这是一个选项,使用 RSpec 的新式“主题”功能。请注意,这将运行 before :all block 两次,一次用于每个嵌套的“describe” block 。如果这最终变得太慢,您可以以无法对状态共享示例使用“主题”语法为代价来平息事情(因为主题适用于它在其中使用的整个描述 block )。

shared_examples_for "valid status" do
it { should be_an_instance_of(Api::SoapStatus) }
its(:code) { should eql(0) }
its(:errors) { should be_an_instance_of(Array) }
its(:errors) { should be_empty }
end

describe "Countries API" do
before :all do
co1 = Factory(:country)
co2 = Factory(:country)
@result = invoke :GetCountryList, "empty_auth"
end

subject { @result }
it { should be_an_instance_of(Api::GetCountryListReply) }
its(:country_list) { should be_an_instance_of (Array) }
it "should have countries in the country list" do
@result.country_list.each {|c| c.should be_an_instance_of(Api::Country)}
end
its(:country_list) { should have(2).items }

describe "result status" do
subject { @result.status }
it_should_behave_like "valid status"
end
end

关于ruby-on-rails - 重构 Rspec 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2738232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com