Rhino Mocks,每次执行stubbed方法时返回不同的结果

时间:2009-02-07 20:18:55

标签: c# rhino-mocks

在此示例中,.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);
}

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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