class_docstr: Base class for testing FXRateReader implementations.
  
  To test a new FXRateReader implementation, subclass from this base class
  and implement the ``reader`` property, returning an FXRateReader that uses
  the data stored in ``cls.fx_rates``.
code: def make_fx_rates(cls, fields, currencies, sessions):
      ndays = len(sessions)
  
      # Give each currency a timeseries of "true" values, and compute fx
      # rates as ratios between true values.
      reference = pd.DataFrame(
          {
              "USD": np.linspace(1.0, 2.0, num=ndays),
              "CAD": np.linspace(2.0, 3.0, num=ndays),
              "GBP": np.linspace(3.0, 4.0, num=ndays),
              "EUR": np.linspace(4.0, 5.0, num=ndays),
          },
          index=sessions,
          columns=currencies,
      )
  
      cls.tokyo_mid_rates = cls.make_fx_rates_from_reference(reference)
      # Make london_mid different by adding +1 to reference values.
      cls.london_mid_rates = cls.make_fx_rates_from_reference(
          reference + 1
      )
  
      # This will be set as cls.fx_rates by WithFXRates.
      return {
          "london_mid": cls.london_mid_rates,
          "tokyo_mid": cls.tokyo_mid_rates,
      }
  
imports: import itertools
  import pandas
  import numpy
  from zipline.data.fx import DEFAULT_FX_RATE
  from zipline.testing.predicates import assert_equal
  import zipline.testing.fixtures
label_desc: Use image node_id 1 for calling the _FXReaderTestCase obj's underlying member method code with example usage: obj.make_fx_rates(cls, fields, currencies, sessions) and returns: dict