调用回调时,Moq回调值不会更改
本文关键字:回调 Moq 调用 | 更新日期: 2023-09-27 18:30:04
嗨,我想创建一个mock对象,每次调用GetPath方法时,我都会迭代。这是我的单元测试代码:
string fileSharePath = "/fileSharePath/";
int i = 0;
m_FileShareDocumentPathProvider.Setup(p => p.GetPath(It.IsAny<IFileShareDocument>()))
.Callback(() =>
{
i++;
fileSharePath += i;
})
.Returns(fileSharePath);
以下是GetPath获取的代码:
foreach (var document in documents)
{
string filePath = GetFilePath(document);
fileSharePaths.Add(filePath);
documentsDictionary.Add(document, filePath);
}
private string GetFilePath(IFileShareDocument document)
{
var fileShareDocumentPathProvider = m_FileShareDocumentPathProviderFactory.GetFilePathProvider(document);
var filePath = fileShareDocumentPathProvider.GetPath(document);
return filePath;
}
在调试时,我注意到fileSharePath的值并没有像预期的那样改变,而是保持不变。
我做错了什么?
编辑:
m_FileShareDocumentPathProviderFactory.Setup(f => f.GetFilePathProvider(It.IsAny<IFileShareDocument>()))
.Returns(m_FileShareDocumentPathProvider.Object);
您需要将Returns(fileSharePath)
更改为Returns(()=>fileSharePath)
。当您调用Returns
时,它会按值传递fileSharePath
,因此该值永远不会更改。您必须将其作为委托传递,这会导致Moq每次"返回"值时都执行该函数。
事实上,您可以通过取消Callback
而只执行.Returns(() => fileSharePath += ++i)
来缩短代码。很少需要为单个函数同时使用Callback
和Returns
。Callback
"mock执行"void
函数,Return
"mock"执行具有返回值的函数,然后返回该值。