constructor(options) {
      this.byRunableId_ = {};
      this.getCurrentRunableId_ = options.getCurrentRunableId;
      this.globalErrors_ = options.globalErrors;

      this.spyFactory = new j$.SpyFactory(
        () => {
          if (this.getCurrentRunableId_()) {
            return this.customSpyStrategies();
          } else {
            return {};
          }
        },
        () => this.defaultSpyStrategy(),
        () => this.makeMatchersUtil()
      );

      this.spyRegistry = new j$.SpyRegistry({
        currentSpies: () => this.spies(),
        createSpy: (name, originalFn) =>
          this.spyFactory.createSpy(name, originalFn)
      });
    }
{@link AsymmetricEqualityTester|Asymmetric equality testers} allow for
non-exact matching in matchers that use Jasmine's deep value equality
semantics, such as {@link matchers#toEqual|toEqual},
{@link matchers#toContain|toContain}, and
{@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}.

@example
const someComplexObject = {
  foo: 'bar',
  baz: 'a string that contains "something"',
  qux: 'whatever'
};
// Passes.
expect(someComplexObject).toEqual(jasmine.objectContaining({
  foo: 'bar',
  baz: jasmine.stringContaining('something')
});

@namespace asymmetricEqualityTesters