2012-12-16 20 views
6

Jaki jest najprostszy sposób modyfikacji pliku scenarios.js w celu sfałszowania żądania AJAX podczas testu end-to-end?Jak wyśmiać żądanie AJAX?

<!doctype html> 
<html lang="en" ng-app="myApp"> 
<head> 
    <meta charset="utf-8"> 
    <title>My Test AngularJS App</title> 
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script> 
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular-resource.min.js"></script> 

    <script language="javascript" type="text/javascript"> 
     angular.module('myApp', ['ngResource']); 
     function PlayerController($scope,$resource){ 
     $scope.player = $resource('player.json').get(); 
     } 
    </script> 

</head> 
    <body ng-controller="PlayerController"> 
    <p>Hello {{player.name}}</p> 
    </body> 
</html> 

Gracz pobiera poprawnie pobrane z pliku o nazwie player.json na serwerze i następujące przejścia testowe. W jaki sposób mogę przekazać inny json do tego testu i zapobiec pobieraniu z powrotem na serwer?

/* 
How do I pass in 
player.json -> {"name":"Chris"} 
*/ 
describe('my app', function() { 

    beforeEach(function() { 
    browser().navigateTo('../../app/index.html'); 
    }); 

    it('should load player from player.json', function() { 
    expect(element('p:first').text()). 
     toMatch("Hello Chris"); 
    pause(); 
    }); 

}); 

Odpowiedz

4

Powinieneś użyć $httpBackend from ngMockE2E module, aby sfałszować żądania http. Spójrz na dokumenty.

+3

Chodzi mi o to, że nie patrz przykład ngMockE2E w docs. Szukam kilku linii kodu, które można dodać do pliku scenarios.js. – Chris

+0

Nie powinieneś modować skryptu scenario.js, jeśli dobrze rozumiem twoje pytanie. Odpowiedź Caio jest standardowym sposobem radzenia sobie z tą sytuacją. –

+3

Ok. Pozwól mi wyjaśnić. Nie rozumiem, jak zrobić to, co zaleca Caio. Jest trochę magii, która jest zakładana przez dokumentację taką jak "Później, ładuj swoją aplikację z tym nowym modułem.". Jak to zrobić? – Chris

0

Na początek dodaj angular-mocks.js i plik (np. App.js), w którym utworzysz moduł na stronie index.html zawierającej deklarację ng-app.

<html lang="en" ng-app="myApp"> 
    <head> 
    <script src="js/app.js"></script> 
    <script src="../test/lib/angular/angular-mocks.js"></script> 
    ... 

Następnie w pliku app.js zdefiniuj moduł i dodaj odpowiedzi próbne.

var myAppDev = angular.module('myApp', ['ngResource','ngMockE2E']); 

myAppDev.run(function($httpBackend) { 
    var user = {name: 'Sandra'}; 
    $httpBackend.whenGET('/api/user').respond(user); 
}); 
0

Wygląda na to, że obecnie nie można TYLKO modyfikować pliku scenarios.js, aby uwzględnić szyderstwo $ httpBackend. Będziesz musiał dodać inny kod, aby go wspierać.

Dla mnie najlepszym sposobem wydaje się być następujące

Dodaj myAppTest.js w folderze testowego, który obejmuje „ngMockE2E”, dzięki czemu nie trzeba zanieczyszczają istniejące app.js

'use strict'; 

angular.module('myAppTest', ['myApp', 'ngMockE2E']) 
.run(function($httpBackend) { 
    var user = {name: 'Sandra'}; 
    $httpBackend.whenGET('/api/user').respond(user); 
}); 

Następnie dodaj osobny test-index.html, który używa nowego pliku myAppTest.js. Pamiętaj, że musisz dołączyć angular-mocks.js. (Pozostawia plik HTML produkcyjną nienaruszona i wolna od mocks)

<!doctype html> 
<html lang="en" ng-app="myAppTest"> 
<head> 
    <script src="lib/angular/angular.js"></script> 
    <script src="lib/angular/angular-resource.js"></script> 
    <script src="../test/lib/angular/angular-mocks.js"></script> 
    <script src="js/app.js"></script> 
    <script src="js/controllers.js"></script> 
    <script src="../test/e2e/myAppTest.js"></script> 
</head> 
<body> 
    <div ng-view></div> 
</body> 
</html> 

Następnie w swoim scenarios.js tylko odwołujących nowy test-index.html przed uruchomieniem innych testów.

beforeEach(function() { 
    browser().navigateTo('../../app/test-index.html#/'); 
}); 

Mam dostosowany ten przykład z:

https://github.com/stephennancekivell/angular_e2e_http/tree/ngMockE2E

+1

jak dokładnie masz zamiar testować trasy w oryginalnej aplikacji? Trasy są skonfigurowane z nazwą aplikacji – wakandan