Как проверить возвращаемое значение приватных методов в контроллере - PullRequest
3 голосов
/ 26 марта 2012

Я хочу протестировать частные методы (не действия) контроллера с помощью rspec

class FooController < ApplicationController
  def some_methods( var )
    if  var 
      return 1
    else 
      return 2
    end
  end

  def some_action
    var = true
    r = some_methods(var)
    r
  end
end

RSpec:

require 'spec_helper'

describe FooController do
   describe "GET index" do
      it "get get return value from some_methods" do
          @controller = TestController.new
          r =@controller.instance_eval{ some_action }  
          r.should eq 2
  end
end

Это мой rspec код. Тем не менее, r всегда равен 1, и я не знаю, как передать параметр в some_action. Как я могу проверить реальные возвращаемые значения some_methods, используя способ rspec? (например: r.should be_nil)

ссылка, но не работа:

  1. Rspec, Rails: как проверить приватные методы контроллеров?

  2. Как определить частный метод

Ответы [ 3 ]

4 голосов
/ 27 марта 2012

Я все еще немного растерялся. Вам не нужно заботиться о возвращаемом значении контроллера action . Действия должны отображать контент, а не возвращать значимые значения. Но я все равно постараюсь ответить.

Если вы хотите убедиться, что FooController#some_action вызывает закрытый метод #some_methods с определенным параметром, вы можете использовать #should_receive:

describe FooController do
  describe 'GET index' do
    it 'should get the return value from some_methods' do
      controller.should_receive(:some_methods).with(true).and_return(1)
      get :index
    end
  end
end

Этот пример завершится ошибкой, если контроллер никогда не получит сообщение :some_methods, но на самом деле он не проверяет возвращаемое значение метода #some_action (потому что это почти никогда не имеет смысла).

Если вам нужно проверить поведение #some_methods, вам следует написать отдельные тесты для этого, используя методы, описанные в статьях, на которые вы ссылались.

2 голосов
/ 26 марта 2012

Похоже, у вас здесь происходит несколько разных проблем:

  1. Почему r всегда возвращает 1? r всегда 1, потому что вы звоните some_action с insance_eval. some_action вызывает some_methods(true), а some_methods возвращает 1, если передается значение true. С предоставленным кодом, some_action всегда будет возвращать 1

  2. Я предполагаю, что это просто опечатки, но имя вашего класса FooController и контроллер, который вы тестируете в вашем rspec, - TestController. Кроме того, функция some_methods не помечена как закрытая.

  3. Как передать параметры , вы должны иметь возможность вызывать some_methods непосредственно из вашего блока instance_eval и передавать параметр как обычный вызов функции:

    r = @controller.instance_eval{ some_methods(false) }

    r.should eq 2

0 голосов
/ 26 марта 2012

Зарегистрируйтесь в журнале с помощью оператора print / put или используйте отладчик rails-debug для проверки значения во время выполнения.

устанавливает r = some_methods (var)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...