Ich versuche herauszufinden, wie meine Tests eingeschränkt werden können, so dass der Coverage-Reporter nur eine Funktion berücksichtigt, die ein Test abdeckt geschrieben speziell für diese Funktion.Wie man spezifiziert, welche Funktionen/Methoden durch einen Test mit Karma, Jasmine und Istanbul abgedeckt werden sollten
Das folgende Beispiel aus den PHPUnit doc zeigt ziemlich gut, was ich zu erreichen versuchen:
Die @covers Anmerkung kann im Testcode verwendet wird ein Testverfahren zu spezifizieren, welche Methode (n) will testen :
/**
* @covers BankAccount::getBalance
*/
public function testBalanceIsInitiallyZero()
{
$this->assertEquals(0, $this->ba->getBalance());
}
Wenn der Test oben ausgeführt werden würde, nur die Funktion getBalance
als gedeckt markiert werden und keine andere.
Jetzt einige tatsächliche Codebeispiel aus meinen JavaScript-Tests. Dieser Test zeigt das unerwünschte Verhalten, das ich versuche, sie wieder loszuwerden:
it('Test get date range', function()
{
expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7);
});
Dieser Test die Funktion getDateRange
als abgedeckt wird markieren, aber auch jede andere Funktion, die von innengetDateRange
genannt wird. Aufgrund dieser Eigenart ist die tatsächliche Codeabdeckung für mein Projekt wahrscheinlich viel niedriger als die berichtete Codeabdeckung.
Wie kann ich dieses Verhalten stoppen? Gibt es eine Möglichkeit, Karma/Jasmine/Istanbul so zu verhalten, wie ich es möchte, oder muss ich zu einem anderen Framework für JavaScript-Tests wechseln?
Was in den Sinn kommt, ist die Verwendung von Dependency Injection und Mocks, um die Anzahl der Aufrufe an tatsächlichen Produktionscode zu reduzieren. – henrikmerlander
stimme ich mit henrikmerlander. Wenn Sie stattdessen echte Funktionsaufrufe anstelle von Mocks innerhalb der getesteten Methode indirekt verwenden, testen Sie diese Funktion ebenfalls – ejosafat