Frage

Ich habe einen guten Teil des Tages damit verbracht, herauszufinden, warum ein einfacher RhinoMocks Test nicht den Wert kehre ich in der Rückkehr bin Einstellung. Ich bin sicher, dass ich nur fehlt etwas wirklich einfach, aber ich kann es nicht herausgefunden. Hier ist mein Test:

    [TestMethod]
    public void CopyvRAFiles_ShouldCallCopyvRAFiles_ShouldReturnTrue2()
    {
        FileInfo fi = new FileInfo(@"c:\Myprogram.txt");
        FileInfo[] myFileInfo = new FileInfo[2];
        myFileInfo[0] = fi;
        myFileInfo[1] = fi;
        var mockSystemIO = MockRepository.GenerateMock<ISystemIO>();
        mockSystemIO.Stub(x => x.GetFilesForCopy("c:")).Return(myFileInfo);
        mockSystemIO.Expect(y => y.FileCopyDateCheck(@"c:\Myprogram.txt", @"c:\Myprogram.txt")).Return("Test");
        CopyFiles copy = new CopyFiles(mockSystemIO);

        List<string> retValue = copy.CopyvRAFiles("c:", "c:", new AdminWindowViewModel(vRASharedData));
        mockSystemIO.VerifyAllExpectations();
    }

Ich habe eine Schnittstelle für meine SystemIO Klasse ich vorbei in einem Mock für die meine Copyfiles-Klasse. Ich gründe eine Erwartung auf meine FileCopyDatCheck Methode und sagen, dass es sollte Return ( „Test“). Wenn ich Schritt durch den Code, gibt es eine Null-insteaed. Alle Ideen, was ich bin fehlt hier?

Hier ist meine Klasse Copyfiles Methode:

    public List<string> CopyvRAFiles(string currentDirectoryPath, string destPath, AdminWindowViewModel adminWindowViewModel)
    {
        string fileCopied;
        List<string> filesCopied = new List<string>();
        try
        {
            sysIO.CreateDirectoryIfNotExist(destPath);

            FileInfo[] files = sysIO.GetFilesForCopy(currentDirectoryPath);

            if (files != null)
            {
                foreach (FileInfo file in files)
                {
                    fileCopied = sysIO.FileCopyDateCheck(file.FullName, destPath + file.Name);
                    filesCopied.Add(fileCopied);
                }
            }

            //adminWindowViewModel.CheckFilesThatRequireSystemUpdate(filesCopied);

            return filesCopied;
        }
        catch (Exception ex)
        {
            ExceptionPolicy.HandleException(ex, "vRAClientPolicy");
            Console.WriteLine("{0} Exception caught.", ex);

            ShowErrorMessageDialog(ex);
            return null;
        }
    }

Ich würde denken, dass „fileCopied“ würde der eingestellte Wert Return haben durch das Erwarten. Das GetFilesForCopy gibt die beiden Dateien in myFileInfo. Bitte Hilfe. :)

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Ein Mock startet nicht aufgezeichnete Antworten Rückkehr , bis es eingeschaltet Modus wiederholen mit Replay(). Stubs und spottet nicht ackern in der gleichen Weise. Ich habe eine Blog-Post über den Unterschied .

Beachten Sie auch, dass Sie die alte mischen Rekord-Replay-verify-Syntax mit der neuen anordnen-act-Assertion-Syntax. Mit AAA, sollten Sie nicht Mocks und Expect verwenden. Verwenden Sie stattdessen Stubs und AssertWasCalled wie folgt aus:

[TestMethod]
public void CopyvRAFiles_ShouldCallCopyvRAFiles_ShouldReturnTrue2()
{
    // arrange
    FileInfo fi = new FileInfo(@"c:\Myprogram.txt");
    FileInfo[] myFileInfo = new FileInfo[2];
    myFileInfo[0] = fi;
    myFileInfo[1] = fi;

    var stubSystemIO = MockRepository.GenerateStub<ISystemIO>();
    stubSystemIO.Stub(
        x => x.GetFilesForCopy(Arg<string>.Is.Anything)).Return(myFileInfo);
    stubSystemIO.Stub(
        y => y.FileCopyDateCheck(
            Arg<string>.Is.Anything, Arg<string>.Is.Anything)).Return("Test");

    CopyFiles copy = new CopyFiles(mockSystemIO);

    // act
    List<string> retValue = copy.CopyvRAFiles(
        "c:", "c:", new AdminWindowViewModel(vRASharedData));

    // make assertions here about return values, state of objects, stub usage
    stubSystemIO.AssertWasCalled(
        y => y.FileCopyDateCheck(@"c:\Myprogram.txt", @"c:\Myprogram.txt"));
}

Beachten Sie, wie das Verhalten von Stubs Einrichtung zu Beginn von den Aussagen am Ende getrennt ist. Stub keine Erwartungen gesetzt.

Der Vorteil seperating Verhalten und Aussagen ist, dass Sie weniger Behauptungen pro Test machen, so dass es leichter zu diagnostizieren, warum ein Test fehlgeschlagen ist.

Andere Tipps

Ist die Methode FileCopyDateCheck wirklich mit der aufgerufen genau Strings @"c:\Myprogram.txt" und @"c:\Myprogram.txt" als Argumente?

Ich bin nicht sicher, ob FileInfo ist etwas mit c:\ tun. Vielleicht ist es in Großbuchstaben C:\ modifiziert, die Ihre Erwartung würde nicht funktionieren.

Vielleicht eine Erwartung versuchen, die nicht für die genaue Argumentwerte überprüft

mockSystemIO.Expect(y => y.FileCopyDateCheck(Arg<string>.Is.Anything, Arg<string>.Is.Anything)).Return("Test");

Für weitere Informationen über Argument Einschränkungen finden Sie unter: Rhino Mocks 3.5, Argument Einschränkungen

Ich bin mir ziemlich sicher, dass es auch Möglichkeiten, die Erwartung Fall unempfindlich zu machen.

Ich denke, es ist, weil Ihr CopyvRAFiles () -Methode ist nicht virtuell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top