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 test_read_before_start_date(self):
      # Reads from before the start of our data should emit NaN. We do this
      # because, for some Pipeline loaders, it's hard to put a lower bound on
      # input asof dates, so we end up making queries for asof_dates that
      # might be before the start of FX data. When that happens, we want to
      # emit NaN, but we don't want to fail.
      for bad_date in (
          self.FX_RATES_START_DATE - pd.Timedelta("1 day"),
          self.FX_RATES_START_DATE - pd.Timedelta("1000 days"),
      ):
          for rate in self.FX_RATES_RATE_NAMES:
              quote = "USD"
              bases = np.array(["CAD"], dtype=object)
              dts = pd.DatetimeIndex([bad_date])
  
              result = self.reader.get_rates(rate, quote, bases, dts)
              assert_equal(result.shape, (1, 1))
              assert_equal(np.nan, result[0, 0])
  
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 7 for calling the _FXReaderTestCase obj's underlying member method code with example usage: obj.test_read_before_start_date() without return types