7 Stimmen

Rhino Mocks, die jedes Mal ein anderes Ergebnis zurückgeben, wenn die Stubbed-Methode ausgeführt wird

In diesem Beispiel gibt die .Stub einen neuen Speicherstrom zurück. Beide Male wird derselbe Speicherstrom zurückgegeben. Ich möchte aber jedes Mal einen neuen Speicherstrom haben. Meine Frage ist, wie kann ich die .Stub ändern, damit dieser Test erfolgreich ist?

[TestMethod]
public void Meh()
{
    var mockFileSystem = MockRepository.GenerateMock<IFileSystemService>();
    mockFileSystem.Stub(fs => fs.CreateFileStream(null, FileMode.Append, FileAccess.Write, FileShare.None))
        .IgnoreArguments()
        .Return(new MemoryStream());

    var result1 = mockFileSystem.CreateFileStream(null, FileMode.Append, FileAccess.Write, FileShare.None);
    var result2 = mockFileSystem.CreateFileStream(null, FileMode.Append, FileAccess.Write, FileShare.None);
    Assert.AreNotSame(result1, result2);
}

8voto

Peter Morris Punkte 15720

Der Trick besteht darin, WhenCalled zu verwenden, um die vorherige Return-Operation zu ersetzen:

[TestMethod]
public void Meh()
{
    var mockFileSystem = MockRepository.GenerateMock<IFileSystemService>();
    mockFileSystem.Stub(fs => fs.CreateFileStream(null, FileMode.Append, FileAccess.Write, FileShare.None))
        .IgnoreArguments()
        .Return(null) 

        //*****The return value is replaced in the next line!
        .WhenCalled(invocation => invocation.ReturnValue = new MemoryStream());

    var result1 = mockFileSystem.CreateFileStream(null, FileMode.Append, FileAccess.Write, FileShare.None);
    var result2 = mockFileSystem.CreateFileStream(null, FileMode.Append, FileAccess.Write, FileShare.None);
    Assert.AreNotSame(result1, result2);
}

0voto

Je nachdem, welche Version Sie verwenden, gibt es eine implizite Repeat.Once oder Repeat.Any - Nach Ihrem Test denke ich, dass es eine Repeat.Any ist, die kürzlich hinzugefügt wurde. Ich glaube also, dass es das gleiche Objekt zurückgibt, da das new in Ihrer ursprünglichen Anweisung auftritt, d.h. es ist kein Delegat, das bei jedem Aufruf der gespotteten Methode ausgeführt wird. Um das zu erhalten, was Sie wollen, machen Sie zwei expect-Aufrufe, jeder mit einem repeat.once.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X