سؤال

أجد صعوبة في العثور على أي أمثلة حول كيفية تزييف مكالمة أجاكس باستخدام Jasmine BDD؟

لدي وظيفة اياكس مخصصة تعمل هكذا ...

ajax({
    url: 'JSON.php',
    dataType: 'json',           
    onSuccess: function(resp) {
        console.log(resp);
    }
});

... وليس لدي أي فكرة عن كيفية إنشاء كعب روتين لتزييف استدعاء وظيفة ajax الفعلية.

أريد تجنب استدعاء وظيفة ajax لأنها قد تؤدي إلى إبطاء مجموعة الاختبار الخاصة بي إذا استغرق استدعاء ajax الحقيقي للخادم بعض الوقت للاستجابة ولدي الكثير من المواصفات في مجموعة الاختبار الخاصة بي.

لقد سمعت أنه يمكنك استخدام spyOn(namespace, 'ajax') لكن هذا أمر مزعج على الفور لأنه يتطلب مني أن أقوم بتغليف ملفي ajax وظيفة في كائن فقط لاستخدام spyOn وظيفة (ولكن بغض النظر عن أنني لم أتمكن من المتابعة لأنني لم أتمكن من العثور على أي أمثلة محددة لتزييف مكالمة أجاكس).

لقد سمعت أيضًا أنه يمكنك استخدام createSpy() ولكن مرة أخرى، الوثائق ليست مفيدة جدًا (ولا الويكي المقابل على GitHub).

أي مساعدة في شرح كيفية استخدام الجواسيس لإنشاء مكالمة أجاكس وهمية سيكون موضع تقدير كبير!

هل كانت مفيدة؟

المحلول

يمكنك استخدام إطار عمل SinonJS الساخر، والذي يحتوي على بنية داخلية خادم وهمي.يمكنك استخدامه بسهولة مع الياسمين:

beforeEach(function() {
        server = sinon.fakeServer.create();
        server.respondWith([200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"])
});

بالمناسبة.إذا كانت وظيفة ajax الخاصة بك موجودة في مساحة الاسم العامة، فلماذا لا تتصل بها spyOn(window, 'ajax')

نصائح أخرى

فيما يتعلق بوظيفة واحدة، يمكنك استخدام 'createSpy':

/*var */ajax = createSpy('foo');

var غائب لأنك تريد إعادة تعريفه، ولكن يلزم بعد ذلك أن تكون الكتلة التي تحدد فيها هذا الجاسوس مرتبطة بنفس النطاق حيث يكون حقيقيًا ajax تم تعريفه.أو، إذا كنت في حيرة من أمرك مع ذلك، استخدم spyOn(window, foo), ، لأنك على أي حال تختبره في المتصفح.

يرى هذه الإجابة للتفاصيل.

فيما يتعلق بمكالمة اياكس، انظر الدعم غير المتزامن قسم في مستندات جديدة, ، أو الاستخدام الأفضل ساعة:

window.ajax = function() {};

var response;

var ajaxSpy = spyOn(window, 'ajax').andCallFake(function(url, callback) {
   setTimeout(function() { callback({ 'foo': 'bar' }); }, 1000);
});

jasmine.Clock.useMock();

function callback(resp) { response = resp;  }

ajax('fake.url', callback);

jasmine.Clock.tick(1500);

expect(ajaxSpy).toHaveBeenCalled();
expect(response).toBeDefined();
expect(response.foo).toBeDefined();

إذا كنت موافقًا على عدم استخدام الجواسيس، بل الوظيفة الإضافية بدلاً من ذلك الياسمين اياكس.للسخرية من استخدام مواصفات واحدة withMock:

  it("allows use in a single spec", function() {
    var onSuccess = jasmine.createSpy('success');
    jasmine.Ajax.withMock(function() {
      ajax({
            url: 'JSON.php',
            dataType: 'json',           
            onSuccess: onSuccess
      });
      expect(onSuccess).not.toHaveBeenCalled();

      jasmine.Ajax.requests.mostRecent().respondWith({
        "status": 200,
        "responseText": '{"some": "json"}'
      });

      expect(onSuccess).toHaveBeenCalledWith('{"some": "json"}');
    });
  });

يتم إرسال الرد فقط عند الاستخدام respondWith.يحتوي الرابط أعلاه على بعض التوجيهات حول كيفية التثبيت

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top