تست اپلیکیشن های جاوا اسکریپتی با sinon.js

ترجمه و تالیف : امیررضا سیستانه ای
تاریخ انتشار : 13 خرداد 98
خواندن در 46 ثانیه
دسته بندی ها : جاوا اسکریپت

sinon یک ابزار مستقل برای تست جاسوسی (spy) و mock ها در جاوا اسکریپت هست و با هر فریمورک unit test کار میکنه.

نصب با استفاده از npm

برای نصب ورژن فعلی sionon از دستور زیر استفاده کنید : 

npm install sinon

اگر بهردلیلی می خواهید از ورژن های قدیمی sinon استفاده کنید, این لینک رو مطالعه کنید و دستور زیر رو بزنید :

npm install sinon@1

نحوه استفاده

تابع زیر یک تابع رو بعنوان argument دریافت میکنه و یک تابع جدید رو بعنوان خروجی تحویل میده. شما میتونید تابع خروجی رو هرچند بار که بخواهید صدا بزنید. اما تابع اورجینال فقط یکبار صدا زده میشود :

unction once(fn) {
    var returnValue, called = false;
    return function () {
        if (!called) {
            called = true;
            returnValue = fn.apply(this, arguments);
        }
        return returnValue;
    };
}

Spies :

تست این تابع میتونه بعنوان یک تست spy (جاسوسی) انجام بشه :

it('calls the original function', function () {
    var callback = sinon.spy();
    var proxy = once(callback);

    proxy();

    assert(callback.called);
});

نکته ای که بالا مطرح کردیم و گفتیم که تابع فقط یکبار صدا زده میشه, اهمیت داره :

it('calls the original function only once', function () {
    var callback = sinon.spy();
    var proxy = once(callback);

    proxy();
    proxy();

    assert(callback.calledOnce);
    // ...or:
    // assert.equals(callback.callCount, 1);
});

همچنین ما به مقدار this و argument ها اهمیت میدیم :

it('calls original function with right this and args', function () {
    var callback = sinon.spy();
    var proxy = once(callback);
    var obj = {};

    proxy.call(obj, 1, 2, 3);

    assert(callback.calledOn(obj));
    assert(callback.calledWith(1, 2, 3));
});

درمورد جاسوس ها بیشتر بدانید.

Stubs 

این تابع توسط once برگردونده میشه و باید هرچیزی که تابع اورجینال برمیگردونه رو برگردونه. برای تست این ما از stub استفاده میکنیم :

it("returns the return value from the original function", function () {
    var callback = sinon.stub().returns(42);
    var proxy = once(callback);

    assert.equals(proxy(), 42);
});

همچنین از stub ها میتونید بعنوان جاسوس استفاده کنید. برای مثال ما میتونیم با کوئری دادن argument ها رو دریافت کنیم.

تست Ajax

تابع زیر محرک (trigger) برای فعالیت های یک شبکه است :

function getTodos(listId, callback) {
    jQuery.ajax({
        url: '/todo/' + listId + '/items',
        success: function (data) {
            // Node-style CPS: callback(err, data)
            callback(null, data);
        }
    });
}

برای اینکه این تابع رو تست کنیم و از trigger شبکه هم خودداری کنیم کافیه از stub JQuery.ajax استفاده کنیم :

after(function () {
    // When the test either fails or passes, restore the original
    // jQuery ajax function (Sinon.JS also provides tools to help
    // test frameworks automate clean-up like this)
    jQuery.ajax.restore();
});

it('makes a GET request for todo items', function () {
    sinon.stub(jQuery, 'ajax');
    getTodos(42, sinon.spy());

    assert(jQuery.ajax.calledWithMatch({ url: '/todo/42/items' }));
});

درخواست تقلبی XMLHttp 

وقتی دارید ajax رو تست میکنیم, بهتره کد درخواست تقلبی XMLHttp هم امتحان کنید :

var xhr, requests;

before(function () {
    xhr = sinon.useFakeXMLHttpRequest();
    requests = [];
    xhr.onCreate = function (req) { requests.push(req); };
});

after(function () {
    // Like before we must clean up when tampering with globals.
    xhr.restore();
});

it("makes a GET request for todo items", function () {
    getTodos(42, sinon.spy());

    assert.equals(requests.length, 1);
    assert.match(requests[0].url, "/todo/42/items");
});

درمورد این درخواست تقلبی بیشتر بدانید.

سرور تقلبی

مثال قبلی نشان داد که این api چقدر منعطف هست, اگر باز هم به این نتیجه نرسیدید, سرور تقلبی رو امتحان کنید :

var server;

before(function () { server = sinon.fakeServer.create(); });
after(function () { server.restore(); });

it("calls callback with deserialized data", function () {
    var callback = sinon.spy();
    getTodos(42, callback);

    // This is part of the FakeXMLHttpRequest API
    server.requests[0].respond(
        200,
        { "Content-Type": "application/json" },
        JSON.stringify([{ id: 1, text: "Provide examples", done: true }])
    );

    assert(callback.calledOnce);
});

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر لازم است ابتدا وارد سایت شوید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید