При тестировании один экземпляр store.query никогда не разрешается
Я пытаюсь написать приемочные CRUD-тесты для своего приложения Ember. По сути, у меня есть модель ("Клиент"), которую я хочу создавать, редактировать и удалять в приемочном тесте. Когда создается клиент, я использую ember-validate для выполнения асинхронной проверки. Эта проверка делает звонок на сервер с помощью store.query
, Когда я запускаю свой приемочный тест самостоятельно, он работает нормально. Однако, когда тест продолжается другим тестом, который использует visit()
помощник, тест не пройден, потому что асинхронная проверка никогда не разрешается, и, следовательно, клиент не может быть создан. Призыв к store.query
успешно запрашивает сервер, и он получает ответ, но по какой-то причине then()
, catch()
, а также finally()
крючки никогда не называются. Кто-нибудь сталкивался с подобными вещами раньше?
Я провел часы в отладчике, следуя за стеком вызовов, пытаясь найти место, где обещание застревает, но мне не повезло.
Вот еще несколько деталей:
Мой тест - сделан более общим для облегчения понимания
import Ember from "ember";
import { module, test } from 'qunit';
import startApp from 'my-app/tests/helpers/start-app';
module('Acceptance | customer', {
setup() {
this.application = startApp();
this.createCustomer = function (unique) {
// The process of creating a customer...
return wait();
};
this.editCustomer = function (unique) {
// The process of editing a customer
return wait();
};
},
teardown() {
Ember.run(this.application, 'destroy');
}
});
// This test doesn't do anything except visit the root url. If I comment out or skip this test, the next test passes. Otherwise, the next test fails.
test(` loads`, () => {
expect(1);
visit('/');
andThen(() => {
ok(true);
});
});
test('a customer can be managed', function (assert) {
const UNIQUE = //Some method for getting a unique string;
expect(3);
// Go to the home page
visit('/');
// Create a customer
andThen(() => this.createCustomer(UNIQUE));
// Assert that creation was successful
andThen(() => {
assert.ok('Some criteria that determines that the customer was created');
});
// Edit the customer
andThen(() => this.editCustomer(UNIQUE));
// Assert that we successfully edited the customer
andThen(() => {
assert.ok('Some criteria that determines that the customer was edited');
});
});
Мой валидатор - сделан более универсальным для облегчения понимания
import Ember from 'ember';
import ValidationsMixin from 'some-mixin';
export default Ember.Object.extend(ValidationsMixin, {
/**
* The Ember data store.
*/
store: Ember.inject.service('store'),
/**
* The customer.
*/
customer: null,
validations: {
'customer.primaryDomain': {
presence: true,
format: \some-regex\,
async() {
let store = this.get('store');
let domain = this.get('customer.primaryDomain');
if (Ember.isEmpty(domain)) {
return Ember.RSVP.resolve(true);
}
// Validate that no other customers exist with the same domain
const promise = store.query('customer', {
primaryDomainList: [domain]
});
// At this point, the promise object is created, but this .then() hook may never get called even though the ajax request was successful.
promise.then(customers => {
// Some extra code that isn't relevant
});
return promise;
}
},
'customer.companyName': {
presence: true
}
}
});