2009-02-07 52 views
7

在本例中,.Stub返回一个新的内存流。两次返回相同的内存流。我想要的是每次都有一个新的内存流。我的问题是,如何更改.Stub以使测试通过?Rhino Mocks,每执行一次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); 
} 

回答

8

的技巧是使用WhenCalled来代替以前的返回操作:

[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

取决于你使用的是什么版本,还有一个含蓄Repeat.Once或Repeat.Any - 从你的测试中,我认为这是这是最近增加了一个Repeat.Any。所以我相信它会返回相同的对象,因为新发生在您的初始语句中,即它不是在每次调用模拟方法时执行的委托。为了得到你想要的,做两个期望的呼叫,每个都有一个repeat.once。

+0

meandmycode是正确的,我只是看着什么不和学到了一些东西。 :) – 2009-02-09 02:02:35

相关问题