Заглушка конкретных экземпляров класса в функциональном тесте

Я хочу проверить, что конкретный значок отображается в представлении для пользователя с полосой более X дней. Поэтому мне нужно заглушить метод streak модели User. Но я хочу, чтобы он заглушил метод только для конкретного пользователя на основе его uid. Код теста приведен ниже.

test "should display an icon for users with streak longer than 7 days" do
    node = node(:one)
    User.any_instance.stubs(:streak).returns([8,10])
    get :show, 
        author: node.author.username, 
        date: node.created_at.strftime("%m-%d-%Y"),
        id: node.title.parameterize
    assert_select ".fa-fire", 1
end

Возвращаемое значение представляет собой массив, первое значение в массиве — это количество дней в полосе, а второе значение — количество сообщений в этой полосе.

Строка User.any_instance.stubs(:streak).returns([8,10]) заглушает любой экземпляр класса User. Как я могу заглушить его, чтобы он заглушал только те экземпляры, где :uid => 1?


person ananyo2012    schedule 19.05.2016    source источник
comment
Я не знаю Ruby, но то, что вы описываете, создает подделку, а не заглушку. Я стараюсь избегать их, как чумы, потому что технически для них нужно писать модульные тесты, чтобы убедиться, что они ведут себя предсказуемо. Возможно, я неправильно понимаю вашу проблему, но я бы написал два теста и использовал две разные заглушки. В одном тесте будет использоваться заглушка, где :uid = 0, а в другом тесте будет использоваться заглушка, в которой :uid является некоторым значением, большим или равным 1.   -  person Andrew Eddie    schedule 30.05.2016


Ответы (1)


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

User.where.not(uid: 1).each do |user|
  user.stubs(:streak).returns([8,10])
end

Или, может быть (я не могу сказать наверняка без дополнительного контекста), вы могли бы оптимизировать это, просто выполнив:

node.author.stubs(:streak).returns([8,10])
person Tom Lord    schedule 19.05.2016
comment
Я пробовал это раньше. Это не сработает, поскольку экземпляры, используемые во время рендеринга страницы, отличаются от заглушенных экземпляров. Поэтому нам нужно специально заглушить экземпляры класса, используя uid. - person ananyo2012; 19.05.2016