Могу ли я вызвать выполненное без передачи выполненного в мою реальную реализацию?
Я пишу несколько тестов с жасмином и использую mockjax для макетирования моих вызовов ajax. Я знаю, что жасмин требует дополнительной работы, чтобы заставить его работать асинхронно, но мне не нравится мое решение.
Я прохожуdone
'в моей реальной реализации, а затем вызывать это из обещания по моему запросу ajax.
Все примеры, кажется, используют setTimeouts как "симуляции", что, на мой взгляд, не совсем полезно.
Вот некоторый код, чтобы помочь понять:
жасмин
$.mockjax({
url: "*/api/AdminBenefits",
contentType: "application/json",
type: "post"
});
beforeEach(function (done)
{
vm.benefit.benefitName(expectedBenefitName);
vm.addBenefit(done); <---- Dirty
});
//Assert
it('should toast success', function (done)
{
expect(fakeToastr.successValue()).toEqual('"' + expectedBenefitName + '"' + " was added successfully.");
done();
});
реализация
model.addBenefit = function(callback) <---- Dirty
{
var value = model.benefit.benefitName();
$.ajax({
url: rootPath + "/api/AdminBenefit",
dataType: "text",
contentType: "application/json",
type: "post",
data: ko.toJSON(model.benefit)
}).done(function(data) {
toastr.success("\"" + value + "\"" + " was added successfully.");
!callback || callback(); <---- Dirty
}).fail(function() {
!callback || callback(); <---- Dirty
});
}
Я все об этом ошибаюсь?
Просто чтобы повторить, я хочу, чтобы Жасмин знала, когда mockjax / ajax -.done() без передачи done
из жасмина в мою модель зрения.
2 ответа
Я никогда не отвечал на этот вопрос после публикации ответа в проблеме Github, которую вы открыли, но код ниже показывает, как я обычно вижу это реализованным в тестах. Обратите внимание, что вы также можете вернуть некоторый результат из вашего исходного кода в callback()
, но это только в том случае, если вы хотите сделать утверждения на этих данных результата (что может быть хорошей идеей).
Тестовый код:
describe("Some functionality", function() {
beforeEach(function ()
{
$.mockjax({
url: "*/api/AdminBenefits",
contentType: "application/json",
type: "post"
});
});
it('should toast success', function (done)
{
vm.benefit.benefitName(expectedBenefitName);
vm.addBenefit(function()
{
expect(fakeToastr.successValue()).toEqual('"' + expectedBenefitName + '"' + " was added successfully.");
// possibly other assertions on the result data passed in the callback...
done(); // tell jasmine you're done with async action
});
});
});
Поскольку Джакерелла был достаточно любезен, чтобы дать ответ, я решил, что я должен также показать, как я решил проблему здесь, я выбрал решение, которое он предоставил мне на GitHub, и определил onAfterComplete.
describe("When clicking the add benefit type button and the server is successful", function () {
//Arrange
var expectedBenefit;
beforeEach(function (done) {
vm.Reset();
expectedBenefit = vm.setRandomBenefit();
$.mockjax({
url: "*/api/AddBenefitType",
type: "post",
onAfterComplete: function () { done(); } //<------
});
//Act
vm.addCurrentBenefit();
});
//Assert
it('should toast success', function (done) {
expect(toastr.successValue()).toEqual('"' + expectedBenefit.Name + '"' + " was added successfully.");
done();
});