Изложете обект от приложението Angularjs на тест с транспортир

Пиша тестове от край до край за моето приложение, базирано на AngularJS, използвайки Protractor. Някои случаи изискват използване на фалшификати за тестване - например проблем с мрежовата връзка. Ако AJAX заявка към сървъра е неуспешна, потребителят трябва да види предупредително съобщение.

Моите мокове са регистрирани в приложението като услуги. Искам те да бъдат достъпни за тестовете, за да напишат нещо подобно:

var proxy;
beforeEach(function() { proxy = getProxyMock(); });

it("When network is OK, request succeeds", function(done) {
    proxy.networkAvailable = true;

    element(by.id('loginButton')).click().then(function() {
        expect(element(by.id('error')).count()).toEqual(0);
        done();
    });
});

it("When network is faulty, message is displayed", function(done) {
    proxy.networkAvailable = false;

    element(by.id('loginButton')).click().then(function() {
        expect(element(by.id('error')).count()).toEqual(1);
        done();
    });
});

Как да внедря функцията getProxyMock за предаване на обект от приложението към теста? Мога да съхранявам проксита в обекта window на приложението, но все още не знам как да осъществя достъп до него.


person Impworks    schedule 07.12.2015    source източник


Отговори (1)


След известно четене и разбиране на процеса на тестване малко по-добре, се оказа невъзможно. Тестовете се изпълняват в NodeJS и кодът на интерфейса в браузър - екземплярите на Javascript обект не могат да бъдат наистина споделени между два различни процеса.

Има обаче заобиколно решение: можете да изпълните скрипт в браузъра.

Първо, вашият интерфейсен код трябва да предоставя някакъв вид локатор на услуги, като този:

angular.module('myModule', [])
       .service('proxy', NetworkProxy)
       .run(function(proxy) {
           window.MY_SERVICES = {
               proxy: proxy,
           };
       });

След това тестът протича така:

it("Testing the script", function(done) {
    browser.executeScript(function() {
        window.MY_SERVICES.proxy.networkAvailable = false;
    });

    element(by.id('loginButton')).click().then(function() {
        expect(element.all(by.id('error')).count()).toEqual(1);
        done();
    });
});

Моля, обърнете внимание, че когато използвате executeScript, функцията се сериализира, за да бъде изпратена до браузъра за изпълнение. Това налага някои ограничения, които си струва да имате предвид: ако вашата скриптова функция върне стойност, тя е клонинг на оригиналния обект от браузъра. Актуализирането на върнатата стойност няма да промени оригинала! По същата причина не можете да използвате затваряния във функцията.

person Impworks    schedule 08.12.2015