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