Ошибка RSpec: фиктивный "Employee_1" получил неожиданное сообщение: to_ary with (без аргументов) - PullRequest
4 голосов
/ 07 марта 2011

У моего приложения есть две модели: Пользователь и Сотрудник, и их отношение - пользователь has_many сотрудников.

Поскольку я пытаюсь написать контрольный пример Rspec для контроллера сотрудника:

describe "GET 'edit'" do
  it "should get user/edit with log in" do
    log_in(@user)
    employee = mock_model(Employee, :id=>1, :user_id=>@user.id)
    get :edit, :id=>employee
    response.should be_success
  end
end

Я получил результат как:

....F

Failures:

  1) EmployeesController GET 'edit' should get user/edit with log in
     Failure/Error: get :edit, :id=>employee
       Mock "Employee_1" received unexpected message :to_ary with (no args)
     # C:in `find'
     # ./app/controllers/employees_controller.rb:41:in `edit'
     # ./spec/controllers/employees_controller_spec.rb:51:in `block (3 levels) in '

Finished in 4.31 seconds
5 examples, 1 failure

Может кто-нибудь помочь мне с этим, пожалуйста?Спасибо

Ответы [ 3 ]

6 голосов
/ 11 марта 2011

Я думаю, проблема в том, что вы используете mock_model, который будет выдавать ошибки, если вы вызываете метод для модели, для которой вы явно не создаете ожидание. В этом случае вы можете создать своего сотрудника с помощью stub_model, поскольку вы не выполняете никаких проверок вызовов, фактически сделанных модели.

describe "GET 'edit'" do

  it "should get user/edit with log in" do
    log_in(@user)
    employee = stub_model(Employee, :id=>1, :user_id=>@user.id)
    get :edit, :id=>employee
    response.should be_success
  end
end
4 голосов
/ 08 марта 2011

Rails может вывести идентификатор из истинного экземпляра модели, вот как это работает:

@employee = Employee.create
get :edit, :id => @employee

Это не работает с mock_model по неясным для меня причинам. Вы можете просто передать идентификатор явно:

  employee = mock_model(Employee, :id => 1, :user_id=>@user.id)
  get :edit, :id => employee.id # or just :id => 1
1 голос
/ 14 марта 2014

Я думаю, что проблема с mock_model, вы можете использовать double для этого.

describe "GET 'edit'" do

  it "should get user/edit with log in" do
    log_in(@user)
    employee = double('employee', :id=>1, :user_id=>@user.id)
    get :edit, :id=>employee
    response.should be_success
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...