2009-02-07 12 views
7

W tym przykładzie .Stub zwraca nowy strumień pamięci. Ten sam strumień pamięci jest zwracany za każdym razem. To, czego chcę, to nowy strumień pamięci za każdym razem. Moje pytanie brzmi: jak mogę zmienić .Stub, aby ten test przeszedł?Rhino Mocks, zwracający inny wynik za każdym razem, gdy wykonywana jest metoda stubbed

[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); 
} 

Odpowiedz

8

Sztuką jest wykorzystanie WhenCalled zastąpić poprzednią operację powrotu:

[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); 
} 
0

W zależności od wersji używasz istnieje Repeat.Once implicity lub Repeat.Any - Z testu myślę, że jest to Repeat.Any którego dodano niedawno. Tak więc uważam, że zwraca ten sam obiekt, ponieważ nowy występuje w twoim oświadczeniu, tzn. Nie jest delegatem, który jest wykonywany przy każdym wywołaniu wyśmiewanej metody. Aby uzyskać to, czego chcesz, wykonaj dwa połączenia oczekujące, każdy z powtarzaniem.

+0

meandmycode jest prawidłowy, po prostu wyglądało na to, co robi i dowiedział Czy coś. :) –

Powiązane problemy