2013-12-25 4 views
2

Я пытаюсь выполнить модульный тест метода в контроллерах Angularjs с использованием jasminejs и Karma runner . Мой метод принимает путь изображения в аргументе и преобразует это изображение в текст (TESSERACT-OCR).Модульное тестирование Angularjs jasmine

, когда я пытаюсь вызвать модульное тестирование, как это он не работает:

TypeError: Attempted to assign to readonly property. at workFn

it('has to return text from image', inject(function($httpBackend) { 
$scope.ocr("./image.png"); 
$httpBackend.expectPOST('/ocr').respond(); 
expect(scope.oceriser.bind("./ocr.png")).toMatch("ocr"); 

}));

, когда я сделать следующее:

it('has to return text from image', inject(function($httpBackend) { 
$scope.ocr("./image.png"); 
$httpBackend.expectPOST('/ocr').respond(); 
expect($scope.ocr("./ocr.png")).toMatch("ocr"); 

}));

я получаю эту ошибку:

Expected undefined to match 'éàîè'.

может я получить доступ к значению scope.textes.text $ из теста ??

Мой вопрос в том, как я могу получить доступ к значению $ scope.textes.text, которое содержит текст из моего тестового файла? возможно ли, я не думаю, потому что он находится в анонимной функции. Является ли это правильным модульным тестом? я могу узнать больше в этом модульном тесте? Может ли кто-нибудь помочь мне, я новичок в тестировании с жасмином

ответ

1

Обычно, когда модуль тестирует HTTP-вызов, вы настраиваете ожидание против $httpBackend, вызывайте функцию, которую вы тестируете нормально, затем вызовите $httpBackend.flush(), чтобы подделать ожидаемый ответ HTTP и завершить вызов синхронно, а затем проверить результат.

Таким образом, принимая удар на тесте, он бы, вероятно, выглядеть следующим образом ....

it('has to return text from image', inject(function($httpBackend) { 

var expected = {}; // the value expected from the HTTP request 

// set up the http expectation. this tells angular what you expect to have called through $http when flush() is called 
$httpBackend.expectPOST('/oceriser').respond(expected); 

// call the function you are testing 
scope.oceriser('./image.png'); 

// flushes the pending fake HTTP response causing the call to oceriser above to complete synchronously, and the function will continue normally 
$httpBackend.flush(); 

// now, verify that oceriser() did what you expect when the http call succeeds. you'll need to figure this out, but in this example, i assume textes contains no elements initially, but after oceriser is called, it will contain one element with the text property equal to expected 
expect(scope.textes.length).toBe(1); 
expect(scope.textes[0].text).toBe(expected); 
expect(scope.textes[0].source).toBe('./image.png') 
})); 
+0

это помогло мне много спасибо – badaboum

+0

, когда я изменить мой массив '$ scope.textes.push 'к объекту, подобному ' $ scope.textes = {source: source, text: text} 'и при попытке получить доступ к тексту свойства внутри единичного тестового файла, например' expect (scope.textes.text) .toBe (ожидается) ; 'У меня проблема, потому что свойство scope.textes.text имеет то же значение, что и ожидаемая переменная. любые идеи ?? мне нужно использовать область. $ digest() после flush() для синхронизации области? – badaboum

+0

Нет, $ digest не нужен, так как все будет позаботиться о вас во время HTTP-запроса. Это может быть проблема равенства. 'toBe' ожидает, что значение будет точно таким же, или в экземпляре объектов, для объектов, которые будут _same instance_. Если вы клонируете/копируете и это _looks_ одинаково, но это другой экземпляр, тест завершится неудачно. Если вы ожидаете того же самого точного экземпляра, и он не работает, просто пройдите через свой код и посмотрите, где вы поступили неправильно. – HackedByChinese

Смежные вопросы