Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RSpec控制器测试,测试后操作_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

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是一个实例的方法,而不是类方法。我喜欢这个实现,但当我将它设置为这个时,我仍然得到一个错误。我发布了问题中的最新错误。我喜欢这个实现,但是当我将它设置为这个时,我仍然得到了一个错误。我公布了问题中的最新错误。