7

在本例中,.Stub 返回一个新的内存流。两次都返回相同的内存流。我想要的是每次都有一个新的内存流。我的问题是,如何更改 .Stub 以使此测试通过?

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

2 回答 2

8

诀窍是使用 WhenCalled 替换之前的 Return 操作:

[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);
}
于 2009-02-09T10:26:58.507 回答
0

根据您使用的版本,有一个隐含的Repeat.Once 或Repeat.Any - 从您的测试中我认为它是最近添加的Repeat.Any。所以我相信它会返回相同的对象,因为 new 出现在您的初始语句中,即它不是在每次调用模拟方法时执行的委托。为了得到你想要的,做两个期望调用,每个调用一个repeat.once。

于 2009-02-08T17:35:50.287 回答