2016-05-16 8 views
5

Мое приложение использует службу, которая возвращает обещание, которое обычно зависит от целой группы других обещаний. Я реорганизовал это в отдельные именованные функции, чтобы упростить тестирование (и читаемость). Поэтому в этом случае я просто хочу проверить, что функция запуска выполняет свою работу и вызывает другие функции.Функция вызывается после того, как обещание разрешено, но Жасмин не проходит тест. Зачем?

например.

run() { 
    return myService 
    .connection 
    .then(this.namedFunction1) 
    .then(this.namedFunction2) 
    .then(this.namedFunction3) 
    .catch((error) => { 
     console.log("doh!", error.stack); 
    }); 

Когда я проверить, что namedFunction1 был назван Жасмин выходит из строя, даже если это не так. Вот небольшой пример кода, я сделал, чтобы держать вещи простыми:

getString() { 
    return Promise.resolve("Heeeelp. Heeeelp!!"); 
    } 

    printToConsole(string) { 
    console.log(string); // This works! but Jasmine says nay :( 
    } 

    myFunction() { 
    this.getString() 
    .then(this.printToConsole) 
    .catch((error) => { 
     console.log("Some error occurred", error); 
    }); 
    } 

... и тест:

it("should call the printToConsole function", function() { 
     spyOn(myClass, "printToConsole").and.callThrough(); //added the call through so it would print 
     myClass.myFunction(); 
     expect(myClass.printToConsole).toHaveBeenCalled(); 
    }); 

и выход ...

> Started F[2016-05-16 11:32:31.898] console - Heeeelp. Heeeelp!! 
> 
> 
> Failures: 1) MyClass myFunction should call the printToConsole 
> function Message: 
>  Expected spy printToConsole to have been called. Stack: 
>  Error: Expected spy printToConsole to have been called. 

Я я попробовал добавить функцию jasmine asynch done(), но это ничего не делало, и в конечном итоге я немедленно разрешаю это обещание в этом примере.

Так почему и как может этот тест потерпеть неудачу?

Любая помощь была бы принята с благодарностью. Благодарю.

ответ

4

Потому что myFunction - это асинхронная операция. myFunction вызывает функцию async, а затем немедленно возвращается, после чего запускается тестовое утверждение. В этот момент printToConsole еще не был вызван. Вы хотите использовать Jasmine's async test support для успешного выполнения этого теста.

Вам нужно изменить myFunction вернуть обещание, так что вы можете знать, когда она завершена:

myFunction() { 
    return this.getString() 
    .then(this.printToConsole) 
    .catch((error) => { 
    console.log("Some error occurred", error); 
    }); 
} 

Тогда вы будете модифицировать тест, чтобы использовать функцию done представленную Жасмин:

it("should call the printToConsole function", function(done) { 
    spyOn(myClass, "printToConsole").and.callThrough(); //added the call through so it would print 
    myClass.myFunction().then(function() { 
    expect(myClass.printToConsole).toHaveBeenCalled(); 
    done(); 
    }).catch(done); // to make sure the test reports any errors 
}); 

Это должно заставить все работать.

+0

Я попытался использовать поддержку async ранее, но мое утверждение не было внутри инструкции myClass.myFunction(). Then(). Теперь это имеет больше смысла. Спасибо друг. – spryce