Тестирование двух разных ожиданий с насмешкой - PullRequest
1 голос
/ 28 июля 2010

Я недавно добавил Devise в свое первое приложение на Rails3, и у меня возникли некоторые проблемы с тестами контроллера.

Я тестирую класс контроллера User, который является той же моделью, которую использует Devise. Итак, в начале моей спецификации у меня есть это:

before(:each) do
  sign_in @user = Factory.create(:user)
end

Теперь я могу пройти тестирование без использования насмешек или заглушек:

describe "GET edit" do
  it "assigns the requested user as @user" do
    user = Factory(:user)
    get :edit, :id => user.id
    assigns(:user).should eql(user)
  end
end

Но в образовательных целях я хотел бы знать, как заставить его работать с насмешками и заглушками, обычно это было бы совершенно прямо, но кажется, что Devise вызывает User.find перед действием контроллера и делает тест неудачным. .

describe "GET edit" do
  it "assigns the requested user as @user" do
    user = Factory(:user)
    User.expects(:find).with(:first, :conditions => {:id => 37}).returns(user)
    get :edit, :id => '37'
    assigns(:user).should be(user)
  end
end

Кроме того, добавив twice к ожиданию, это также не удастся, потому что первый вызов, который нужно найти, отличается от того, для которого я устанавливаю ожидание.

Любое понимание будет оценено.

1 Ответ

5 голосов
/ 30 июля 2010

Вы можете указать несколько возвращаемых значений с помощью stubs или expects, например:

require 'test/unit'
require 'mocha'

class Foo
end

class FooTest < Test::Unit::TestCase

  # This passes!
  def test_multiple_returns_with_stubs
    Foo.stubs(:find).returns('a').returns('b').returns('c')

    assert_equal('a', Foo.find('z'))
    assert_equal('b', Foo.find('y'))
    assert_equal('c', Foo.find('x'))
  end

  # This passes too!
  def test_multiple_returns_with_expects
    Foo.expects(:find).times(1..3).returns('a').returns('b').returns('c')

    assert_equal('a', Foo.find('z'))
    assert_equal('b', Foo.find('y'))
    assert_equal('c', Foo.find('x'))
  end
end

Разница, по-видимому, в том, что expects нужно знать, сколько раз он будет вызываться. Если вы ничего не указали, он принимает once и будет жаловаться на последующие звонки. stubs не волнует.

...