Nano Hash - криптовалюты, майнинг, программирование

Тест контроллера Rails rspec возвращает неизвестный хэш

У меня есть очень простой контроллер, который выглядит так.

module Veterinarians
  module Dictionaries
    class SpecialitiesController < ApplicationController
      respond_to :json

      skip_before_action :check_current_vet, only: %i( index )

      def index
        @specialities = Veterinarians::Speciality.all
        respond_with(@specialities)
      end
    end
  end
end

У меня есть тест контроллера rspec, который выглядит так.

require 'rails_helper'

Rails.describe Veterinarians::Dictionaries::SpecialitiesController, type: :controller do
  # Not returning a response body in JSON when testing RSPEC (https://github.com/rails/jbuilder/issues/32)
  render_views true

  routes { Veterinarians::Engine.routes }

  let(:user) { double :user, id: 123 }
  before { sign_in(user) }

  context '#index' do
    let(:speciality) { double :speciality, id: :some_id, value: :some_val }

    before { allow(Veterinarians::Speciality).to receive(:all).and_return [speciality] }

    subject { get :index, format: :json }

    it { is_expected.to have_http_status(:ok) }
    it { expect(JSON.parse(subject.body)).to include('id' => 'some_id', 'value' => 'some_val') }
  end
end

Второй пример завершается с этой ошибкой.

expected [{"__expired" => false, "name" => "speciality"}] to include {"id" => "some_id", "value" => "some_val"}

Любые намеки на то, почему это не удастся и откуда берется хэш с «__expired»?

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


Ответы:


1

Я подозреваю, что это происходит из внутреннего представления RSpec о двойнике:

https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/test_double.rb#L10

Двойники RSpec иногда плохо работают вместе с Rails. Попробуйте создать настоящий экземпляр Speciality или использовать для этого что-то вроде FactoryGirl.

13.05.2016

2

Rails в конечном итоге вызывает to_json на двойном уровне. Вы не заглушили этот метод на двойнике, поэтому вызывается метод to_json, добавляющий к Object.

Эта реализация просто выводит переменные экземпляра объекта, что в данном случае является внутренним состоянием тестового двойника.

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

14.05.2016

3

Вы должны использовать фабрики для создания ваших тестовых данных. Двумя самыми популярными из них являются FactoryGirl или FactoryBot.

Пример:

FactoryGirl.define do
  factory :user do
    sequence(:email) { |n| "name#{n}@example.com" }
    password 'password'
  end
end

sequence(:email) создаст вам разные электронные письма для каждого пользователя. Более подробную информацию можно найти здесь.

01.03.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..