2016-07-08 15 views
-3
x(string)= y(string) != ? y : string.empty 

Wie 100% Codeabdeckung für obige Zeile mit Assert AnweisungErklärung für ternären Operator in Rhino Mocks?

wir versucht haben, mit bekommen: Assert.AreEqual (Actual, ExpectedValue); aber wir Code-Abdeckung irgendwo fehlt

+2

Könnten Sie bitte den ** echten ** Code hinzufügen? Der von Ihnen bereitgestellte Code wird nicht einmal kompiliert! Außerdem sollte eine 100% ige Codeabdeckung nicht nur um ihrer selbst willen ein Ziel sein. Was sind die Anwendungsfälle und/oder Anforderungen, die Sie testen müssen? –

+0

Entschuldigung, wir können den echten Code nicht für das Problem der Einhaltung bereitstellen, aber wir wollen nur wissen, wie wir einen ternären Operator mit einer assert-Anweisung unter Code-Coverage abdecken können. Außerdem müssen wir es gemäß unserem Anwendungsfall unter der Code-Abdeckung abdecken. –

+2

Im Grunde benötigt man zwei Testfälle für 100% Deckung, einen für die Bedingung 'y! = ...' bestanden und einen dafür. Abhängig von dieser Bedingung müssen Sie möglicherweise weitere Fälle hinzufügen. Implementieren Sie also entweder zwei Testmethoden oder erstellen Sie eine und wenden Sie das 'TestCase'-Attribut mit einem' Result'-Parameter darauf an. – HimBromBeere

Antwort

1

Grundsätzlich, wenn Ihr ganzer Code nur x = y != ... y : string.empty ist, benötigen Sie zwei verschiedene Test-Fälle, einen für die Bedingung, und eine für sie scheitert.

Dies kann auf zwei Arten erreicht werden. Man wäre ein Test-Methode für jeden Fall zu schaffen:

string MethodToTest(string y) { 
    return y != /* whatever your condition is */ ? y : string.empty 
} 
[Test] 
public void Test1() { 
    Assert.AreEqual(MethodToTest("PassingCondition"), "PassingCondition"); 
} 
[Test] 
public void Test2() { 
    Assert.AreEqual(MethodToTest("NotPassingCondition"), string.empty); 
} 

Andere Möglichkeit wäre, ein Verfahren zu schaffen, und fügen Sie TestCase -Attribut hinzu:

[TestCase("PassingCondition", Result = "PassingCondition")] 
[TestCase("NotPassingCondition", Result = string.empty)] 
public bool TheTest(string y) { 
    return MethodToTest(y); 
} 

jedoch beide appraoches in Mittel gleich sind Code-Abdeckung. Es hängt vom tatsächlichen Zustand ab, wie Sie die Codeabdeckung erreichen. Aber Sie haben nicht die tatsächliche Bedingung gestellt, die es uns unmöglich gemacht hat, diesen spezifischen Punkt zu beantworten.

EDIT: Wie Sie auch Rhino-Mocks (die ich nicht kenne) zur Verfügung gestellt habe, nehme ich an, was Sie übergeben, da die Bedingung von einer Methode zurückgegeben wird, die Sie verspotten möchten. So verspotten Sie diese Methode, sobald Sie eine vorübergehende Bedingung zurückgeben, und eine, die eine versagende Bedingung zurückbringt.

+0

Tatsächlich verwenden wir Rhino Mock zum Testen und die Attribute, die Sie in der Probe verwendet haben, sind von Nunit.Stattdessen haben wir den gleichen Prozess verwendet, den Sie in der ersten Methode bereitgestellt haben, aber wir können die vollständige Codeabdeckung nicht erreichen. –

+0

Ich weiß nicht, ob Rhino '[TestCase]' -Attribut kennt, aber Sie können immer noch den ersten Ansatz mit 'verwenden [TestMethod] 'anstelle von' [Test] '. – HimBromBeere

+2

FYI - Rhino Mocks ist zum Spotten, nicht für die Testattribute. NUnit, XUnit, MSTest usw. enthalten alle die Testattribute wie TestCase, Test etc ... wenn auch unterschiedlich, je nachdem, welche Sie verwenden. Hier ist ein Vergleich der Test-Frameworks: https://xunit.github.io/docs/comparisons.html –

1

Sie sollten wirklich nicht 100% Code-Abdeckung anstreben, wenn das alles ist, was Sie tun. Komponententests, die nichts richtig testen, sind Zeitverschwendung und Wartbarkeit.

Um einen ternären Operator vollständig zu testen (100%), müssen Sie alle Bedingungen testen.

Betrachten Sie eine einfache boolesche Variable 'isMorning', die bei 'true' 'Morning' und 'false' 'Afternoon' zurückgibt. Sie müssten einen Test schreiben, der 'isMorning' auf 'true' gesetzt hat und daher das erwartete Ergebnis 'Morning' ist, dann einen anderen Test, der 'isMorning' auf 'false' gesetzt hat und somit das erwartete Ergebnis 'Nachmittag' ist.

public void Test1() { 
    var isMorning = true; 
    var result = isMorning ? "Morning" : "Afternoon"; 
    Assert.AreEqual("Morning", result); 
} 

public void Test2() { 
    var isMorning = false; 
    var result = isMorning ? "Morning" : "Afternoon"; 
    Assert.AreEqual("Afternoon", result); 
} 

Hoffe, das hilft.

FYI - Wenn Sie etwas wie JetBrains DOTCOVER verwenden, wird es nicht getesteten Code hervorheben.