无法模拟与 Emberfire 的会话

Unable to mock session with Emberfire

我正在针对同时具有管理员和非管理员功能的路由编写非常基本的验收测试。我的测试断言,如果我是第一次使用该应用程序,我看不到已登录的功能。在我的应用程序中,我使用 password 身份验证如下:

this.get('session').open('firebase', {
  provider: 'password',
  email: email,
  password: password
});

我发现当我未在应用程序中进行身份验证时,运行 验收测试通过了。但是,如果我随后登录该应用程序,然后 运行 测试,我的断言会失败,因为会话已恢复,而我认为不应该。这是测试:

import { test } from 'qunit';
import moduleForAcceptance from 'app/tests/helpers/module-for-acceptance';
import startApp from '../helpers/start-app';
import destroyApp from '../helpers/destroy-app';
import replaceAppRef from '../helpers/replace-app-ref';
import replaceFirebaseAppService from '../helpers/replace-firebase-app-service';
import stubFirebase from '../helpers/stub-firebase';
import unstubFirebase from '../helpers/unstub-firebase';
import { emptyApplication } from '../helpers/create-test-ref';

moduleForAcceptance('Acceptance | index', {
  beforeEach: function() {
    stubFirebase();
    application = startApp();
    replaceFirebaseAppService(application, { });
    replaceAppRef(application, emptyApplication());
  },
  afterEach: function() {
    unstubFirebase();
    destroyApp(application);
  }
});

test('empty app - not authenticated', function(assert) {
  visit('/');
  andThen(function() {
    assert.equal(currentURL(), page.url, 'on the correct page');

    // this works if there's no session - fails otherwise
    assert.notOk(page.something.isVisible, 'cannot do something');
  });
});

我认为 replaceFirebaseAppService 应该覆盖 torii-adapter 但它似乎不是。任何帮助将不胜感激。

我正在使用:

Ember      : 2.7.0
Ember Data : 2.7.0
Firebase   : 3.2.1
EmberFire  : 2.0.1
jQuery     : 2.2.4

仔细观察 Emberfire,replaceFirebaseAppService 正在尝试替换在 torii-adapter:firebase 注册的 torii 适配器,而我的应用程序将其注册为 torii-adapter:application

我最终所做的基本上是在我自己的助手中复制 replaceFirebaseAppService

import stubFirebase from '../helpers/stub-firebase';
import startApp from '../helpers/start-app';
import replaceAppRef from '../helpers/replace-app-ref';
import createOfflineRef from './create-offline-ref';

export default function startFirebaseApp(fixtures = { }) {
  stubFirebase();
  let application = startApp();

  // override default torii-adapter
  const mock = { };
  application.register('service:firebaseMock', mock, {
    instantiate: false,
    singleton: true
  });
  application.inject('torii-provider:application', 'firebaseApp', 'service:firebaseMock');
  application.inject('torii-adapter:application', 'firebaseApp', 'service:firebaseMock');

  // setup any fixture data and return instance
  replaceAppRef(application, createOfflineRef(fixtures));
  return application;
}

这可以防止 torii-adapter 解析我在使用我的应用程序时可能拥有的任何会话数据。然后我可以使用提供的 torii 助手在我需要的地方模拟我的会话:

// torii helper
import { stubValidSession } from 'app/tests/helpers/torii';

// mock a valid session
stubValidSession(application, { });

希望能帮别人节省一些时间。