调用回调时,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);

调用回调时,Moq回调值不会更改

您需要将Returns(fileSharePath)更改为Returns(()=>fileSharePath)。当您调用Returns时,它会按值传递fileSharePath,因此该值永远不会更改。您必须将其作为委托传递,这会导致Moq每次"返回"值时都执行该函数。

事实上,您可以通过取消Callback而只执行.Returns(() => fileSharePath += ++i)来缩短代码。很少需要为单个函数同时使用CallbackReturnsCallback"mock执行"void函数,Return"mock"执行具有返回值的函数,然后返回该值。