Ruby on rails RSpec控制器测试,测试后操作
现在我有一个Ruby on rails RSpec控制器测试,测试后操作,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,现在我有一个subscriber控制器,它创建了一个订阅服务器,但这不是我想要测试的。我在控制器中还有一个方法,在订阅者的访问属性中添加1(我将发布代码),这是我想要测试的方法,但我不确定如何测试?我是rails和Rspec的新手,所以我很难掌握这些概念。为了清楚起见,我将发布我的测试和控制器 控制器: def search @subscriber = Subscriber.new end def visit @subscriber = Subscriber.find_by_phone
subscriber
控制器,它创建了一个订阅服务器,但这不是我想要测试的。我在控制器中还有一个方法,在订阅者的访问属性中添加1(我将发布代码),这是我想要测试的方法,但我不确定如何测试?我是rails和Rspec的新手,所以我很难掌握这些概念。为了清楚起见,我将发布我的测试和控制器
控制器:
def search
@subscriber = Subscriber.new
end
def visit
@subscriber = Subscriber.find_by_phone_number(params[:phone_number])
if @subscriber
@subscriber.visit =+ 1
@subscriber.save
flash[:notice] = "thanks"
redirect_to subscribers_search_path(:subscriber)
else
render "search"
end
end
试验
错误消息:
正如你所看到的,这就是我想要测试的方法。目前的测试不起作用,但我认为它可能有助于展示我的想法。希望这是足够的信息,如果您想查看其他内容,请告诉我?因为您正在检查
订阅者。访问您应该将订阅者更改为订阅者:
expect { post :create, :subscriber => subscriber }.to change(subscriber, :visit).by(1)
访问
是实例的方法,而不是类方法。因为您正在检查订户。访问
您应该将订户
更改为订户
:
expect { post :create, :subscriber => subscriber }.to change(subscriber, :visit).by(1)
访问
是实例的方法,而不是类方法。我认为您可以这样做:
it 'adds 1 to the visit attribute' do
# I'm assuming you need this, and you are creating the user before
sign_in(user)
# I'm assuming your factory is correct
subscriber = FactoryGirl.create(:subscriber)
visits_before = subscriber.visit
post :create, subscriber: { phone_number: subscriber.phone_number }
subscriber.reload
expect(subscriber.visit).to eq(visits_before)
end
describe "#GET visit" do
before { allow(Subscriber).to receive(:find).and_return(subscriber) }
let(:subscriber) { FactoryGirl.create(:subscriber) }
it "adds one to the visit attribute" do
sign_in(user)
expect { get :visit }.to change(subscriber, :visit).by(1)
end
end
我想你可以这样做:
it 'adds 1 to the visit attribute' do
# I'm assuming you need this, and you are creating the user before
sign_in(user)
# I'm assuming your factory is correct
subscriber = FactoryGirl.create(:subscriber)
visits_before = subscriber.visit
post :create, subscriber: { phone_number: subscriber.phone_number }
subscriber.reload
expect(subscriber.visit).to eq(visits_before)
end
describe "#GET visit" do
before { allow(Subscriber).to receive(:find).and_return(subscriber) }
let(:subscriber) { FactoryGirl.create(:subscriber) }
it "adds one to the visit attribute" do
sign_in(user)
expect { get :visit }.to change(subscriber, :visit).by(1)
end
end
我认为你在测试错误的方法。您已经声明您的create
操作是有效的,因此无需在此处进行测试。单元测试都是关于隔离测试中的方法
您编写的测试是测试post:create
是否执行某些操作。如果您想测试您的visit
方法是否有作用,您需要执行以下操作:
it 'adds 1 to the visit attribute' do
# I'm assuming you need this, and you are creating the user before
sign_in(user)
# I'm assuming your factory is correct
subscriber = FactoryGirl.create(:subscriber)
visits_before = subscriber.visit
post :create, subscriber: { phone_number: subscriber.phone_number }
subscriber.reload
expect(subscriber.visit).to eq(visits_before)
end
describe "#GET visit" do
before { allow(Subscriber).to receive(:find).and_return(subscriber) }
let(:subscriber) { FactoryGirl.create(:subscriber) }
it "adds one to the visit attribute" do
sign_in(user)
expect { get :visit }.to change(subscriber, :visit).by(1)
end
end
我认为你在测试错误的方法。您已经声明您的create
操作是有效的,因此无需在此处进行测试。单元测试都是关于隔离测试中的方法
您编写的测试是测试post:create
是否执行某些操作。如果您想测试您的visit
方法是否有作用,您需要执行以下操作:
it 'adds 1 to the visit attribute' do
# I'm assuming you need this, and you are creating the user before
sign_in(user)
# I'm assuming your factory is correct
subscriber = FactoryGirl.create(:subscriber)
visits_before = subscriber.visit
post :create, subscriber: { phone_number: subscriber.phone_number }
subscriber.reload
expect(subscriber.visit).to eq(visits_before)
end
describe "#GET visit" do
before { allow(Subscriber).to receive(:find).and_return(subscriber) }
let(:subscriber) { FactoryGirl.create(:subscriber) }
it "adds one to the visit attribute" do
sign_in(user)
expect { get :visit }.to change(subscriber, :visit).by(1)
end
end
这正是我回答你的,visits是一个实例的方法,而不是类方法。这正是我回答你的,visits是一个实例的方法,而不是类方法。我喜欢这个实现,但当我将它设置为这个时,我仍然得到一个错误。我发布了问题中的最新错误。我喜欢这个实现,但是当我将它设置为这个时,我仍然得到了一个错误。我公布了问题中的最新错误。